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

标签 ios objective-c swift dependency-injection nsarray

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

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

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

在我的 Swift 项目中,我想定义一个协议(protocol)。该协议(protocol)应定义 4 个方法:2 个 setter 和 2 个 getter。

我希望以某种方式定义协议(protocol),以便我可以在 Swift 中使用扩展重新打开 Auth 类,并声明 Auth 符合我的协议(protocol),而无需在扩展的主体中放置任何内容,因为 Objective-C 类已经符合。

这是我的协议(protocol):

protocol AuthProtocol {
    var clientID: String! { get set }
}

这是扩展:

extension Auth: AuthProtocol {}

这很好用。现在我可以将 Auth 对象视为 AuthProtocols,并有权设置和获取它们的 clientID 属性。

当我尝试让协议(protocol)为范围数组定义 setter 和 getter 时,问题就出现了。我相信NSArrayArray<AnyObject>在 swift 。这是我尝试过的:

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

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

extension Auth: AuthProtocol {}

不提示吗?

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

最佳答案

您可以使用 Xcode 通过使用“生成的接口(interface)”命令向您准确显示协议(protocol)应该是什么:

Generated Interface Prompt

这会跳转到生成的代码:

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

将生成的类定义转换为正确的协议(protocol)定义:

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

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

关于ios - 如何使用 Objective-C NSArray 的 getter 和 setter 定义 Swift 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40335679/

相关文章:

ios - SwipeCellKit 滑动删除未调用

swift - 为什么 nil 合并运算符包装一个隐式展开的默认值?

swift - 如何简单地返回我的基础对象的实例?

ios - 在iphone设备中找出无效日期

ios - XCode:如何在横向和纵向模式之间更改 View 布局

ios - 重新加载 tableView 时遇到问题

objective-c - 绑定(bind)属性更改时自动创建新实体

iphone - 如何减小 objective-c 中图像的大小

objective-c - OSStatus NSOSStatusErrorDomain

swift - 不可变结构比可变结构有什么好处?