2016-05-31 176 views
0

来自Objective-C背景,每个协议都必须具有委托属性。在Swift中,似乎并非如此,它打破了我对协议的范例。Swift vs Objcective-C协议

AFAIK在Swift中,协议用于两个主要目的:委托模式(它需要像Objective-C这样的委托)以及组合模式(Objective-C中不存在并且不需要委托属性)与扩展相结合,使其比Objective-C中的传统继承模式更有效。

我理解正确吗?你能澄清一下吗?

编辑:

我的意思我看到不同的是: 从苹果公司的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中看到像这样使用协议。那他们有什么不同?

+5

*“......,每一个协议必须始终有一个代表属性” * - 号 –

+6

你有一些非常不正确的假设。在Objective-C中,每个协议都不需要委托属性。 – rmaddy

+0

另外,每个具有一个或多个属性的类都使用组合模式。这与编程语言无关。协议与组合模式无关(任何语言)。 – rmaddy

回答

7

无论在Objective-C还是在Swift中,协议都有一个目的:允许任意或不相关的类型保证具有某些成员(或者在可选成员的情况下,至少可能具有这些成员) 。特别是,这个保证对于编译器来说是重要的。那么基本上,协议是一种伪类型,覆盖了真正的类型结构,并以新的方式将其结合起来(而不是像其他语言为相同目的而使用的“mixin”;例如,Ruby,不需要协议,因为它有模块)。例如,Bird和Insect可能是不相关的类,甚至可能是(不是Swift中的)类,但如果它们都采用需要方法的Flier协议,编译器就知道它们可以同时飞行,并且将允许将fly()消息发送给鸟或昆虫。

协议可用于各种常见和重要的体系结构模式(如委托)的事实是协议性质的纯粹次要但非常自然的后果。

+0

如此迅速协议与Objective-C没有什么不同? – Honey

+2

基本上协议是一个协议。 Swift协议是基于Objective-C协议建模的。不过,它们更强大,因为你可以有协议扩展,并且可以被结构和枚举所采纳,而这些结构和枚举没有其他表达层次结构的方式。 – matt

2

Swift中的协议可以在没有对象的情况下实现(在协议扩展中)。它们也可以扩展。在Swift中,你也可以使用泛型来做什么,这在Objective C中是无法做到的。

因此,例如Indexable协议可以扩展为具有返回索引范围长度的函数,该索引范围长度可能仅适用于该指数是一个Int这样的:

extension Indexable where Self.Index == Int 
{ 
    func length() -> Int 
    { 
    return endIndex - startIndex 
    } 
} 

(!但愿我想起我的雨燕语法正确)

+0

您可以举一个没有对象的实现的例子吗? – Honey

+1

有上斯威夫特协议的东西https://developer.apple.com/videos/play/wwdc2015/408/ –

+0

晶圆厂WWDC的视频,我已经看到了视频,但我只能抓住它的某些部分。你指的是哪一部分?你介意用示例代码编辑你的答案吗? – Honey