【问题标题】:Define property that must be a subclass AND conform to protocol定义必须是子类并符合协议的属性
【发布时间】:2015-09-07 14:09:44
【问题描述】:

在 Swift 2.0 中,我怎样才能做到与 @property (nonatomic, strong) NSManagedObject*<SomeProtocol> model 等效?

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

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

【问题讨论】:

  • 抱歉,我认为您在 Objective-C 中的财产声明不合法。我发现它只适用于id<SomeProtocol>
  • 嗯,你可能是对的。我想这就是为什么有一个 NSObject 协议。我想知道 Swift 是否可以简单地为每个类自动生成一个随附的协议?
  • 如果这是真的,那就太糟糕了,因为它会导致需要一些烦人的演员表
  • 你可以只继承 NSManagedObject 并使子类符合你的协议吗?
  • 是的,我想很好的解决方法

标签: swift swift2


【解决方案1】:

斯威夫特 4

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

var myObject: NSManagedObject & SomeProtocol

【讨论】:

    【解决方案2】:

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

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

    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>
    

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多