我有以下协议和符合它的类:
protocol Foo{
typealias BazType
func bar(x:BazType) ->BazType
}
class Thing: Foo {
func bar(x: Int) -> Int {
return x.successor()
}
}
当我尝试创建一个foos数组时,我得到一个奇怪的错误:
var foos: Array<Foo> = [Thing()]
Protocol Foo只能用作通用约束,因为它具有Self或相关类型要求 .
好的,所以它只能在它有一个相关的类型要求(它确实如此)时使用,但由于某种原因这是一个错误? WTF?
我不确定我完全理解编译器试图告诉我的内容......
2 回答
比方说,如果我们可以将
Thing
的实例放入数组foos
中,会发生什么?因为
AnotherThing
也符合Foo
,所以我们也可以将它放入foos
.现在我们随机从
foos
抓取foo
.我打算调用方法
bar
,你能告诉我我应该发送一个字符串或整数到bar
吗?foo.bar("foo")
或foo.bar(1)
斯威夫特不能 .
所以它只能用作通用约束 .
什么情况需要像这样的协议?
Example:
我一直在玩你的代码试图了解如何实现协议 . 我发现你不能将Typealias用作泛型类型,因为它只是一个别名而不是一个类型 . 因此,如果您在协议和类之外声明Typealias,则可以在代码中有效地使用它,而不会出现任何问题 .
Note: Typealias在其声明中具有
Int
类型,这样您始终可以使用别名而不是Int类型并使用其所有关联的方法和函数 .这是我如何使它工作: