我这样做是为了测试目的。它有助于依赖注入(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 时,问题就出现了。我相信NSArray
是Array<AnyObject>
在 swift 。这是我尝试过的:
protocol AuthProtocol {
var clientID: String! { get set }
var scopes: Array<AnyObject> { get set }
}
现在重新打开的行Auth
对于扩展提示
Type
Auth
does not conform to protocolAuthProtocol
当我单击错误时,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)应该是什么:
这会跳转到生成的代码:
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/