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

帕春

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

我有一个Objective-C库,已将其导入到Swift 3项目中。Objective-C库中的类之一是通过以下方式定义的:

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

在我的Swift项目中,我想定义一个协议。该协议应定义4种方法:2个设置方法和2个获取方法。

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

这是我的协议:

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

这是扩展名:

extension Auth: AuthProtocol {}

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

当我尝试使协议为scopes数组定义setter和getter时,就会出现问题。我相信NSArrayArray<AnyObject>Swift。这是我尝试过的:

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 在其自身类型中使用

我如何AuthProtocolscopes数组的getter和setter定义以便此行:

extension Auth: AuthProtocol {}

不抱怨吗

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

凯西

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

生成的界面提示

这将跳转到生成的代码:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为Objective-C和Swift制作通用的iOS库?

C ++:如何使getter和setter使用空的构造函数

如何在 Objective-C 中使用 swift 协议实现?

Swift:如何为静态库创建外部接口(Objective-C .h中的公共标头模拟)

如何为 C 风格的字符串数组编写 Getter 和 Setter?

如何编写C ++ getter和setter

在Objective-C中使用Swift协议

如何使用反射定义动态的setter和getter?

Typescript Vuex-如何使用setter和getter定义状态?

如何在Objective-C中定义和使用ENUM?

如何创建符合Swift和Objective-C共享协议的类方法?

如何使我的Objective-C类符合Swift的“ Equatable”协议?

如何调用swift方法,该参数是来自Objective C的协议

如何使Swift类符合Objective-C协议,而又不使其暴露于Objective-C?

如何使用 Roslyn 在 C# 中忽略属性 Getter 和 Setter

如何在Swift中使用具有只读属性的Objective-C协议

如何在 Objective-C 代码中使用导入的 Swift 协议和类?

iOS11 Swift 4 - 如何检查 Swift 类是否符合 Objective-C 中定义的协议?

在Objective C和Swift中部分实现协议

在C#中使用getter和setter

如何从 Haskell 调用 C++ Setter 和 Getter

使用Objective-C属性获取器实现Swift协议

Objective-C如何调用Swift方法?

如何从Swift调用Objective-C代码?

如何从Swift隐藏Objective C声明

如何为Objective-C Project批量添加2个字母的前缀/名称空间?

如何为getter / setter编写类型定义(打字稿)

我如何查找Objective-C的属性@synthesize getter setter代码

Swift为什么不像Java或C#那样使用getter和setter作为属性?