我这么做是为了测试。它有助于依赖注入。
我有一个目标-C库,我已经导入我的Swift 3项目。Objective库中的一个类是这样定义的:
@interface Auth : NSObject
@property (strong, readwrite) NSString *clientId;
@property (strong, readwrite) NSArray *scopes;
@end在我的Swift项目中,我想定义一个协议。协议应该定义4个方法:2个setter和2个getter。
我希望以一种方式定义协议,以便我可以在Swift中用扩展重新打开Auth类,并声明Auth符合我的协议,而无需在扩展的主体中放置任何内容,因为Objective类已经符合。
这是我的协议:
protocol AuthProtocol {
var clientID: String! { get set }
}这是分机:
extension Auth: AuthProtocol {}这个很好用。现在,我可以将Auth对象视为AuthProtocols,并访问设置和获取它们的clientID属性。
当我试图使协议定义范围数组的setter和getter时,就会出现问题。我相信NSArray是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
如何为AuthProtocol数组定义带有getter和setter的scopes,这样行:
extension Auth: AuthProtocol {}不抱怨吗?
所有这些都表明问题与NSArray类型有关。
发布于 2016-10-31 18:35:47
通过使用“”命令,您可以使用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 {}https://stackoverflow.com/questions/40335679
复制相似问题