Играя с кодом в другом посте SO, я обнаружил это интересное поведение.
Как мы знаем, тип weak var
должен быть типом класса, а тип, используемый в ограничении generi c, должен быть типом класса или типом протокола.
Следовательно, это не компилируется:
class Foo<T> {
weak var bar: T? // error
func foo<U: T>(u: U) {} // error
}
Согласно этой записи , я могу наложить ограничение AnyObject
(или любой протокол, имеющий ограничение : class
) на T
для удаления первой ошибки:
class Foo<T: AnyObject> {
weak var bar: T?
func foo<U: T>(u: U) {} // error
}
Но вторая ошибка по-прежнему остается:
Тип 'U' ограничен непротокольным типом, не относящимся к классу 'T '
Компилятор, кажется, лежит здесь сквозь зубы. Удаляя первую ошибку, компилятор только что признал, что T
действительно является типом класса, и теперь он говорит, что это не так.
Почему это происходит? Разве они не разработали эту функцию?