我刚刚发现了这个奇怪的cookie,不知道我是对它没有按预期工作感到惊讶,还是这是我在过去五年中第一次每天使用Swift看到它。
现在,我希望Bar
类型可以从Baz
访问,但事实并非如此:
class Foo<Bar> {
func bar() -> Bar? { nil }
}
class Baz: Foo<String> {
override func bar() -> Bar? { nil } // 💥 Use of undeclared type 'Bar'…
}
用typealias
:很容易解决
class Foo<Bar> {
typealias Bar = Bar // This just feels so wrong…
func bar() -> Bar? { nil }
}
class Baz: Foo<String> {
override func bar() -> Bar? { nil } // 👌 That's it…
}
我的问题是:这在官方文档中有提到或解释吗?通过继承类隐藏Bar
有什么好处?
这种情况很少发生的原因之一可能是因为我们经常传递泛型类型:
class Foo<Bar> {
func bar() -> Bar? { nil }
}
class Baz<Bar>: Foo<Bar> {
override func bar() -> Bar? { nil } // 👌 No problems…
}
并使用与associatedtype
的协议,该协议与上面的typealias
做相同的工作:
protocol P {
associatedtype Bar
}
class Foo<Bar>: P {
func bar() -> Bar? { nil }
}
class Baz: Foo<String> {
override func bar() -> Bar? { nil } // 👌 All good…
}
附言:我不是在问如何解决这个问题我想知道官方文件中是否提到了当前的行为,或者是否有可信的文章解释了这种行为的原因。
Foo<Bar>
Bar
只是"泛型"类型的一个类型别名(我的意思是你想要Int
、Double
等类型(。因此,如果你把String
给Foo
,就像(Foo<String>
(现在String
的Bar
别名一样。并且CCD_ 16别名仅从CCD_ 17识别。
class Foo<Bar> {
func bar() -> Bar? { return nil }
}
错误
class Baz: Foo<String> {
override func bar() -> Bar? { return nil } // `Bar` is `String` now so you should use `String?` in your return type
}
正确
class Baz: Foo<String> {
override func bar() -> String? { return nil }
}
奖金
破解Swift关于Swift泛型的文章