如何使用 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 {}
我这样做是为了测试目的。它有助于依赖注入。
我有一个 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 protocolAuthProtocol
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 {}