繁体   English   中英

定义必须是子类并符合协议的属性

[英]Define property that must be a subclass AND conform to protocol

在Swift 2.0中,我如何才能完成@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model

基本上,我正在尝试在我的类上定义一个属性,它必须都是NSManagedObject的子NSManagedObject并且符合SomeProtocol (我将调用两者定义的方法)。

我看到了这个: https//stackoverflow.com/a/25826948/363789 ,但我不知道如何将这种语法应用于属性定义...

斯威夫特4

现在可以使用以下语法在Swift 4中实现:

var myObject: NSManagedObject & SomeProtocol

不幸的是,Swift还不支持这种类型的组合。

作为解决方法的三个合理的好解决方案(第三个可能是最好的):

1.您可以创建具有这些属性的其他类型,并且所有类型都必须从中继承以便用作model

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

// type declaration
var model: SomeManagedObject

解决这个问题的一种更静态的方法是使用泛型:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM