我这样做是出于测试目的。它有助于依赖注入。
我有一个Objective-C库,已将其导入到Swift 3项目中。Objective-C库中的类之一是通过以下方式定义的:
@interface Auth : NSObject
@property (strong, readwrite) NSString *clientId;
@property (strong, readwrite) NSArray *scopes;
@end
在我的Swift项目中,我想定义一个协议。该协议应定义4种方法:2个设置方法和2个获取方法。
我希望以某种方式定义协议,以便我可以在Swift中使用扩展名重新打开Auth类,并声明Auth符合我的协议,而无需在扩展名中添加任何内容,因为Objective-C类已经符合要求。
这是我的协议:
protocol AuthProtocol {
var clientID: String! { get set }
}
这是扩展名:
extension Auth: AuthProtocol {}
这很好。现在,我可以将Auth对象视为AuthProtocols,并有权设置和获取其clientID属性。
当我尝试使协议为scopes数组定义setter和getter时,就会出现问题。我相信NSArray
是Array<AnyObject>
Swift。这是我尝试过的:
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
在其自身类型中使用
我如何AuthProtocol
用scopes
数组的getter和setter定义,以便此行:
extension Auth: AuthProtocol {}
不抱怨吗
所有这些都向我表明问题与NSArray
类型有关。
您可以使用Xcode通过“ Generated Interface”命令来向您确切显示该协议是什么:
这将跳转到生成的代码:
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 {}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句