【发布时间】:2014-08-17 00:08:24
【问题描述】:
在 Swift 中,我如何声明一个明确声明它符合某些协议的变量? Objective-c 等效项是 @property id<NSObject>
据我了解,这样做:
var a: NSObject
声明了一个 NSObject 协议类型的变量,但我不这样做,我想声明一个符合 AnyObject 类型的变量。我也有兴趣了解如何声明一个对象数组,其中每个对象都符合该协议。
【问题讨论】:
在 Swift 中,我如何声明一个明确声明它符合某些协议的变量? Objective-c 等效项是 @property id<NSObject>
据我了解,这样做:
var a: NSObject
声明了一个 NSObject 协议类型的变量,但我不这样做,我想声明一个符合 AnyObject 类型的变量。我也有兴趣了解如何声明一个对象数组,其中每个对象都符合该协议。
【问题讨论】:
这里真的不需要AnyObject;如果你关心的只是遵守协议Proto,你可以简单地写var a: Proto。 (在某些情况下,您的协议可能会使用 Self 或其他需要将其用作通用约束的东西;然后您将使用 class C<T: Proto> { var a: T }。
【讨论】:
var a: Proto 指定一致性?有趣的是,我会假设它是 Proto 类型的变量。
Proto 是一种协议类型,因此“属于Proto 类型”除了符合性之外并没有任何意义。不幸的是,Self 警告在某些情况下会阻止您使用此语法。我预计这可能会在以后的 Swift 更新中发生变化。
NSObject protocol 以NSObjectProtocol 的形式导入 Swift(由于与NSObject class 的名称冲突),因此,它将是
var a: NSObjectProtocol
【讨论】:
在 Swift 4 中,这可能是一种更简单的方法。您可以同时声明一些符合协议的类的变量。你可以这样做:
var someVar: ClassA & ProtocolA & ProtocolB
【讨论】: