如何使用Objective-C NSArray的getter和setter定义Swift协议

时间:2016-10-31 02:05:01

标签: ios objective-c swift dependency-injection nsarray

我这样做是为了测试目的。它有助于依赖注入。

我有一个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中的NSArrayArray<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类型有关。

1 个答案:

答案 0 :(得分:1)

您可以使用Xcode通过“生成的界面”命令准确显示协议应该是什么:

Generated Interface Prompt

这会让您跳转到生成的代码:

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 {}