2015-09-07 101 views
5

在Swift 2.0中,我該怎麼做@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model的等價物?定義屬性必須是子類並符合協議

基本上,我試圖在我的類上定義一個屬性,它必須都是NSManagedObject的子類,並且符合SomeProtocol(我將調用由兩者定義的方法)。

我看到這個:https://stackoverflow.com/a/25826948/363789,但我不知道我怎麼可以把這種語法屬性定義...

+0

對不起,但我不認爲你在Objective-C中的財產聲明是合法的。我發現它只適用於'id ' – JeremyP

+0

嗯,你可能是對的。我想這就是爲什麼有一個NSObject協議。我想知道Swift是否可以簡單地爲每個類自動生成伴隨協議? – elsurudo

+0

如果這是真的,它有點糟糕,因爲它會導致一些煩人的投射是必要的 – elsurudo

回答

2

不幸的是斯威夫特不支持這種類型的成分呢。

三個合理良好的解決方案,解決方法(第三個可能是最好的):

1. 可以使其他類型的用了這些屬性和必須繼承它爲了所有類型用作model

class SomeManagedObject: NSManagedObject, SomeProtocol { 
    // conforming to protocol 
    func someMethod() 
} 

// type declaration 
var model: SomeManagedObject 

2. 解決這個問題的一種更靜態的方法是使用泛型:

class Aclass<T: NSManagedObject where T: SomeProtocol > { 
    var model: T 
} 

注意:您不必關心的另一種類型必須是超但這解決方案不像以前那樣動態和抽象。

3. 你也可以讓自己的協議,使NSManagedObject符合雖然擴展:

protocol ManagedProtocol { 
    // if you want to access some methods/properties directly from the type 
    func method() 
    var variable: Int { get } 

    // otherwise call all methods/properties through "managedObject" 
    // this property also reduces casting if you want to have the object itself 
    var managedObject: NSManagedObject { get } 
} 

extension NSManagedObject: ManagedProtocol { 
    var managedObject: NSManagedObject { return self } 
} 

現在的類型是抽象的,可以寫成:

var model: protocol<ManagedProtocol, SomeProtocol> 
3

斯威夫特4

這現在可以在Swift 4中使用以下語法:

var myObject: NSManagedObject & SomeProtocol 
相關問題