2016-03-02 93 views
6

我想寫一個弱性能需求的協議。符合它的類必須能夠爲該屬性指定任何類型。另外我不想指定實際的類型,所以它應該是用某種協議指定的類型。此代碼顯示了我對非弱財產的想法:Swift協議中關聯類型的弱性要求

protocol ObjectProtocol: class { 
    typealias PropertyType 
    var property: PropertyType {get set} 
} 

protocol FirstPropertyProtocol: class {} 
protocol SecondPropertyProtocol: class {} 

class FirstObjectImpl: ObjectProtocol { 
    var property: FirstPropertyProtocol? 
} 

class SecondObjectImpl: ObjectProtocol { 
    var property: SecondPropertyProtocol? 
} 

它按預期工作。

我想弱財產做同樣的:

protocol ObjectProtocol: class { 
    typealias WeakPropertyType: AnyObject //must be a class type 
    weak var weakProperty: WeakPropertyType? {get set} 
} 

protocol WeakPropertyProtocol: class {} 

class ObjectImpl: ObjectProtocol { 
    weak var weakProperty: WeakPropertyProtocol? 
} 

而且我得到了一個編譯器錯誤:

Type 'ObjectImpl' does not conform to protocol 'ObjectProtocol'

有沒有什麼辦法可以使這項工作?

+0

的問題是,協議不符合本身,而不是它從繼承的任何協議,見http://stackoverflow.com/questions/33112559/protocol對於類似的問題,不符合自己。在你的情況下,WeakPropertyProtocol類型不符合AnyObject。 –

+0

感謝您的評論,馬丁。有沒有其他的方式來指定我的'WeakPropertyType'是沒有這個'AnyObject'約束的類類型? –

+0

協議當前不需要將屬性實現爲弱存儲屬性。 https://stackoverflow.com/questions/47699813/weak-property-in-a-swift-protocol – Adobels

回答

3

我不相信一個協議可以強制執行弱點。例如:

protocol ObjectProtocol: class { 
    weak var weakProperty: AnyObject? {get set} 
} 

class ObjectImpl1: ObjectProtocol { 
    weak var weakProperty: AnyObject? 
} 

class ObjectImpl2: ObjectProtocol { 
    var weakProperty: AnyObject? 
} 

這些都編譯好了,即使協議具有weak但ObjectImpl2沒有實現它。

編輯:這是你以後在做什麼...

protocol ObjectProtocol: class { 
    typealias WeakPropertyType: Any //must be a class type 
    var weakProperty: WeakPropertyType? {get set} 
} 

protocol WeakPropertyProtocol: class {} 

class ObjectImpl: ObjectProtocol { 
    typealias WeakPropertyType = WeakPropertyProtocol 
    weak var weakProperty: WeakPropertyProtocol? 
} 

實現需要使用任何而非AnyObject,因爲WeakPropertyProtocol是一個協議,而不是一類?

或那樣嗎?...

protocol WeakPropertyProtocol: class {} 

protocol ObjectProtocol: class { 
    typealias WeakPropertyType: AnyObject //must be a class type 
    var weakProperty: WeakPropertyType? {get set} 
} 

class MyWeakClass: WeakPropertyProtocol { 

} 

class ObjectImpl: ObjectProtocol { 
    typealias WeakPropertyType = MyWeakClass 
    weak var weakProperty: MyWeakClass? 
} 

無論哪種方式,我認爲關鍵是在定義類/協議以用於WeakPropertyType其中。

+0

這很有趣,但我不能接受你的答案。我並不需要強制執行弱點。但是我需要能夠在符合我的協議的類中聲明這個屬性很弱。只有擁有類類型的屬性可能很弱,並且我找不到如何在沒有AnyObject約束的情況下指定它。 –

+0

我誤解了你的問題。我會更新我的答案。 – Michael

+0

謝謝Michael!第二個是我需要的。它工作的很好,但我擔心'ObjectProtocol'中的'weakProperty'沒有用'weak'引用指定。此外,我需要在類實現中爲'WeakPropertyType'別名明確指定一個類型。無論如何,您的解決方案目前最適合我。 –

2

我把它與@objc屬性工作了WeakPropertyProtocol:

protocol ObjectProtocol: class { 
    typealias WeakPropertyType: AnyObject //must be a class type 
    weak var weakProperty: WeakPropertyType? {get set} 
} 

@objc protocol WeakPropertyProtocol {} 

class SomeObjectImpl: ObjectProtocol { 
    weak var weakProperty: WeakPropertyProtocol? 
} 

,因爲我關注這個便條apple doc

Note also that @objc protocols can be adopted only by classes that inherit from Objective-C classes or other @objc classes.

我可以用這個限制住這不是一個最好的解決方案,但我會欣賞任何更好的解決方案

0

Swift 4版本。
我需要我的視圖模型符合協議。它們不能保持協調對象:

protocol ViewModelType { 
    associatedtype CoordinatorType: AnyObject 
    weak var coordinator: CoordinatorType? { get } 
} 
+1

協議當前不需要將屬性實現爲弱存儲屬性。 https://stackoverflow.com/questions/47699813/weak-property-in-a-swift-protocol – Adobels