我这样做是为了测试目的。它有助于依赖注入。
我有一个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属性。
当我尝试使协议为scopes数组定义setter和getter时出现问题。我相信Swift中的NSArray
是Array<AnyObject>
。这就是我的尝试:
protocol AuthProtocol {
var clientID: String! { get set }
var scopes: Array<AnyObject> { get set }
}
现在重新打开Auth
扩展程序的行会抱怨
类型
Auth
不符合协议AuthProtocol
当我点击错误时,Xcode建议了一个解决方案,它将此代码添加到exention的主体中:
extension Auth: AuthProtocol {
internal var scopes: Array<AnyObject> {
get {
<#code#>
}
set {
<#code#>
}
}
}
此代码现在internal
行有错误:
scopes
在其自己的类型中使用
如何使用AuthProtocol
数组的getter和setter定义scopes
以便此行:
extension Auth: AuthProtocol {}
不抱怨吗?
所有这些都向我表明问题与NSArray
类型有关。
答案 0 :(得分:1)
您可以使用Xcode通过“生成的界面”命令准确显示协议应该是什么:
这会让您跳转到生成的代码:
open class Auth : NSObject {
open var clientId: String!
open var scopes: [Any]!
}
将此生成的类定义转换为正确的协议定义:
protocol AuthProtocol {
var clientId: String! { get set }
var scopes: [Any]! { get set }
}
// doesn't complain anymore
extension Auth: AuthProtocol {}