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

How to define a Swift protocol with a getter and setter for an Objective-C NSArray

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

我有一个 Objective-C 库,我已经导入到我的 Swift 3 项目中。 Objective-C 库中的一个 class 是这样定义的:

@interface Auth : NSObject
@property (strong, readwrite) NSString *clientId;
@property (strong, readwrite) NSArray *scopes;
@end

在我的 Swift 项目中,我想定义一个协议。该协议应定义 4 个方法:2 setters 和 2 getters.

我希望以某种方式定义协议,以便我可以在 Swift 中重新打开带有扩展名的 Auth class 并声明 Auth 符合我的协议,而无需在正文中放置任何内容扩展名,因为 Objective-C class 已经符合。

这是我的协议:

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 进行扩展的线路抱怨

Type Auth does not conform to protocol AuthProtocol

Xcode 在我点击错误时提出了一个解决方案,它将此代码添加到扩展的主体中:

extension Auth: AuthProtocol {
    internal var scopes: Array<AnyObject> {
        get {
            <#code#>
        }
        set {
            <#code#>
        }
    }
}

此代码现在在 internal 行有一个错误:

scopes used within its own type

如何使用 getter 和 setter 为 scopes 数组定义 AuthProtocol,以便这一行:

extension Auth: AuthProtocol {}

不抱怨吗?

所有这些向我表明问题与 NSArray 类型有关。

您可以使用 Xcode 通过使用 "Generated Interface" 命令向您确切显示协议应该是什么:

这会跳转到生成的代码:

open class Auth : NSObject {
    open var clientId: String!
    open var scopes: [Any]!
}

将此生成的 class 定义转换为正确的协议定义:

protocol AuthProtocol {
    var clientId: String! { get set }
    var scopes: [Any]! { get set }
}

// doesn't complain anymore
extension Auth: AuthProtocol {}