2016-06-10 159 views
0

我有一些對象,每個對象都需要被鎖定,直到購買。Swift協議共享功能

每個對象(NSManaged)都有一個productName StringisPurchased Bool

我寫了一個函數isLocked()它使用那裏屬性以及單身的外部檢查。

這怎麼可以組合成一個協議,以便該協議包含isLocked函數的實現和對象可以堅持協議,然後在需要時調用isLocked?

+0

如果你需要一個通用的實現,這聽起來像你正在尋找一個超類而不是協議。 –

+0

是的,很明顯,但這需要大量的重構,而這在目前是不可能的。我確信我使用協議看到了類似的東西。 – jarryd

+0

在Raywenderlich網站https://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2或wwdc2015 https://developer.apple.com/videos/上面的面向協議的編程檢查播放/ wwdc2015/408 /。希望它有幫助。 –

回答

2

如果我沒有弄錯,這可以通過Swift中的Default實現來實現。

protocol Locakable { 
var productName: String { get } 
var isPurchased: Bool { get } 

func lock() 
func unlock() 
} 

extension Locakable { 

    func isLocked() { 
     if isPurchased { 
      //do something 
      //lock it 
      unlock() 
     } else { 
      lock() 
     } 
    } 
} 

關於那什麼混入或默認實現赤明此Wiki網頁https://en.wikipedia.org/wiki/Mixin

然而更多信息,請注意isLocked()靜態調度。評論是否有不清楚的地方。

如果可能的話,您還可以抽象鎖定和解鎖的想法,並在協議擴展上編寫默認實現。或者像這樣提供一個定製點。

class Item: Locakable { 
var productName = "ItemName" 
var isPurchased = false 

init() { 
    isLocked() 
} 

func lock() { 

} 

func unlock() { 

} 
} 
+0

欲瞭解更多信息,你可以檢查蘋果文檔https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html協議擴展部分。也可能NSHipster的手冊將更適合你http://nshipster.com/swift-default-protocol-implementations/。 – iyuna

+0

productName和isPurchased是每個核心數據實體的屬性,我不能在協議中聲明它們。 – jarryd

+0

使用一個計算的屬性來封裝這個屬性。 – kandelvijaya