2016-05-31 174 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