Подтвердить что ты не робот

Общие ограничения для класса в Swift

Я пытаюсь пометить переменную родового типа как слабое:

class X<T> {
  weak var t: T?
}

Если я не ставил никаких ограничений для T, я получаю ошибку weak cannot be applied to non-class type 'T'.

Если бы я использовал его только с производными классами NSObject, это сработало бы:

class X<T: NSObject> {
  weak var t: T?
}

Но я также хочу иметь возможность использовать чистые классы Swift.

Для протоколов можно потребовать, чтобы разработчик имел тип класса с помощью ключевого слова class:

protocol ClassType: class {
}

С протоколом ClassType я могу теперь отметить переменную как слабую:

class X<T: ClassType> {
  weak var t: T?
}

Но я не могу добавить ключевое слово class непосредственно к общему параметру:

class X<T: class> { // Compile error
  weak var t: T?
}

Я могу заставить решение протокола работать для всех производных классов NSObject с расширением:

extension NSObject: ClassType {
}

Но для чистых классов Swift нет общего суперкласса, к которому я мог бы добавить это расширение. Есть ли способ сделать эту работу без добавления протокола ClassType для каждого класса, с которым я хочу использовать класс X? Например. некоторый специальный классификатор для общего параметра, такого как class X<T:ThisIsAClass>?

4b9b3361

Ответ 1

Вы хотите AnyObject, который документы Swift описывают как:

Протокол, к которому неявно соответствуют все классы.

class X<T: AnyObject> {
    weak var t: T?
}

class C { }
let x = X<C>()  // works fine
x.t = C()  

// error: type 'Int' does not conform to protocol ‘AnyObject’
// (because Int is a struct)
let y = X<Int>()