【问题标题】:How to define a Swift protocol with a getter and setter for an Objective-C NSArray如何为 Objective-C NSArray 定义一个带有 getter 和 setter 的 Swift 协议
【发布时间】:2016-10-31 02:05:00
【问题描述】:

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

我有一个 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 属性。

当我尝试让协议为范围数组定义 setter 和 getter 时,问题就出现了。我相信 NSArray 在 Swift 中是 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 在自己的类型中使用

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

extension Auth: AuthProtocol {}

不抱怨吗?

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

【问题讨论】:

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


    【解决方案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 {}
    

    【讨论】:

    • 这是一个很棒的工具!希望我早点知道。谢谢你。您的解决方案有效。不过,我无法让 xcode 为我生成接口。当我单击Generated Interface 时,xcode 会向我显示这个i.imgur.com/w8BJqdw.png 并挂在那里。我在 Mac OSX Sierra 10.12.1 上使用 Xcode 8.1。对此有什么想法吗?感谢您的帮助。
    • 遗憾的是,这个视图有很多错误。很多时候你需要重新启动 Xcode 或清除派生数据才能工作。
    • 足够好。那行得通。我从昨晚开始就打开了 Xcode。你帮助了很多人。谢谢凯西!
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多