来自Objective-C背景,其中每个协议必须始终具有委托属性。在Swift中似乎并非如此,它打破了我对协议的范式。
Swift中的AFAIK,协议用于两个主要目的:委托模式(需要像Objective-C这样的委托)和组合模式(在Objective-C中不存在,不需要委托属性)与扩展相结合使其比Objective-C中的传统继承模式更有效。
我理解正确吗?你能澄清一下吗?
修改
我所说的与众不同的意思是: 来自Apple的WWDC
传统方式是(Slide76):
class Ordered {
func precedes(other: Ordered) -> Bool { fatalError("implement me!") }
}
class Number : Ordered {
var value: Double = 0
override func precedes(other: Ordered) -> Bool {
return self.value < (other as! Number).value
}
}
新的Swift方式是(幻灯片90):
protocol Ordered {
func precedes(other: Self) -> Bool
}
struct Number : Ordered {
var value: Double = 0
func precedes(other: Number) -> Bool {
return self.value < other.value
}
}
我从未见过在Objective-C中使用这样的协议。那他们有什么不同呢?
答案 0 :(得分:8)
在Objective-C和Swift中,协议都有一个目的:允许任意或不相关的类型保证具有某些成员(或者,对于可选成员,至少可能具有这些成员)。特别是,这种保证对编译器来说非常重要。基本上,协议是一种伪类型,它覆盖真实的类型结构并以新的方式将它联合起来(而不是像其他语言用于同一目的的“mixin”;例如,Ruby;不需要协议,因为它有模块)。
例如,Bird和Insect可能是不相关的类,甚至(在Swift中)根本不是类,但如果它们都采用需要fly()
方法的Flier协议,编译器就会知道它们可以同时飞行,并允许将fly()
消息发送给Bird或Insect。
协议可以用于各种常见和重要的架构模式,例如委派,这是协议性质的纯粹次要但非常自然的结果。
答案 1 :(得分:3)
Swift中的协议可以在没有对象的情况下实现(在协议扩展中)。它们也可以扩展。显然,你可以用Swift中的泛型来做任何事情,这些都不能在Objective C中完成。
因此,例如,可以将Indexable协议扩展为具有返回索引范围长度的函数,该函数可能仅在索引为Int
时才适用:
extension Indexable where Self.Index == Int
{
func length () -> Int
{
return endIndex - startIndex
}
}
(希望我能正确记住我的Swift语法!)