【发布时间】:2016-10-31 02:05:00
【问题描述】:
我这样做是为了测试。它有助于依赖注入。
我有一个 Objective-C 库,已导入到我的 Swift 3 项目中。 Objective-C 库中的一个类是这样定义的:
@interface Auth : NSObject
@property (strong, readwrite) NSString *clientId;
@property (strong, readwrite) NSArray *scopes;
@end
在我的 Swift 项目中,我想定义一个协议。协议应定义 4 个方法:2 个 setter 和 2 个 getter。
我希望以某种方式定义协议,以便我可以在 Swift 中使用扩展重新打开 Auth 类,并声明 Auth 符合我的协议,而无需在扩展的主体中添加任何内容,因为 Objective-C 类已经符合。
这是我的协议:
protocol AuthProtocol {
var clientID: String! { get set }
}
这是扩展名:
extension Auth: AuthProtocol {}
这很好用。现在我可以将 Auth 对象视为 AuthProtocols 并且可以访问设置和获取它们的 clientID 属性。
当我尝试让协议为范围数组定义 setter 和 getter 时,问题就出现了。我相信 NSArray 在 Swift 中是 Array<AnyObject>。这是我尝试过的:
protocol AuthProtocol {
var clientID: String! { get set }
var scopes: Array<AnyObject> { get set }
}
现在重新打开 Auth 以进行扩展的线路抱怨
类型
Auth不符合协议AuthProtocol
当我点击错误时,Xcode 会建议一个解决方案,这会将这段代码添加到扩展的正文中:
extension Auth: AuthProtocol {
internal var scopes: Array<AnyObject> {
get {
<#code#>
}
set {
<#code#>
}
}
}
此代码现在在 internal 行上有一个错误:
scopes在自己的类型中使用
如何使用 scopes 数组的 getter 和 setter 定义 AuthProtocol,以便这一行:
extension Auth: AuthProtocol {}
不抱怨吗?
所有这些都向我表明问题与NSArray 类型有关。
【问题讨论】:
标签: ios objective-c swift dependency-injection nsarray