Swift 2 Objective-C 类型的协议扩展和一致性
Swift 2 Protocol Extensions and Conformance for Objective-C Types
我有这样的设置:
@interface Model: NSManagedObject
...
@end
还有一个像这样的 Swift 协议:
@objc protocol Syncable {
var uploadURL: String { get }
var uploadParams: [String: AnyObject]? { get }
func updateSyncState() throws
}
extension Syncable where Self: NSManagedObject {
func updateSyncState() throws {
... /* default implementation */ ...
}
}
在新的 Swift 文件中,我尝试这样做:
extension Model: Syncable {
var uploadURL: String {
return "a url"
}
var uploadParams: [String: AnyObject]? {
return [:]
}
}
我一直收到错误,Xcode 说 "type 'Model' does not conform to protocol 'Syncable'"。 Xcode 也一直建议我在我的扩展中的某处放置一个 @objc
但它似乎无法弄清楚它应该放在哪里。
我正在做的事情是不可能的吗? (它似乎在操场上的简单条件下工作 - 但显然我的 Objective-C class 是用 Swift 编写的)。
如果不可能,请帮助理解原因。
问题是试图混合 Objective-C 和 Swift 特征。这段纯 Swift 代码编译得很好(请注意,我已经从故事中删除了 NSManagedObject,因为它与问题无关):
class MyManagedObject {}
class Model: MyManagedObject {}
protocol Syncable {
var uploadURL: String { get }
var uploadParams: [String: AnyObject]? { get }
func updateSyncState()
}
extension Syncable where Self: MyManagedObject {
func updateSyncState() {
}
}
extension Model: Syncable {
var uploadURL: String {
return "a url"
}
var uploadParams: [String: AnyObject]? {
return [:]
}
}
那是因为 Swift 知道什么是协议扩展。但是 Objective-C 没有!因此,一旦您说 @objc protocol
就将协议移入 Objective-C 世界,并且协议扩展无效 - 因此模型不符合,因为它没有 updateSyncState
实现.
我有这样的设置:
@interface Model: NSManagedObject
...
@end
还有一个像这样的 Swift 协议:
@objc protocol Syncable {
var uploadURL: String { get }
var uploadParams: [String: AnyObject]? { get }
func updateSyncState() throws
}
extension Syncable where Self: NSManagedObject {
func updateSyncState() throws {
... /* default implementation */ ...
}
}
在新的 Swift 文件中,我尝试这样做:
extension Model: Syncable {
var uploadURL: String {
return "a url"
}
var uploadParams: [String: AnyObject]? {
return [:]
}
}
我一直收到错误,Xcode 说 "type 'Model' does not conform to protocol 'Syncable'"。 Xcode 也一直建议我在我的扩展中的某处放置一个 @objc
但它似乎无法弄清楚它应该放在哪里。
我正在做的事情是不可能的吗? (它似乎在操场上的简单条件下工作 - 但显然我的 Objective-C class 是用 Swift 编写的)。
如果不可能,请帮助理解原因。
问题是试图混合 Objective-C 和 Swift 特征。这段纯 Swift 代码编译得很好(请注意,我已经从故事中删除了 NSManagedObject,因为它与问题无关):
class MyManagedObject {}
class Model: MyManagedObject {}
protocol Syncable {
var uploadURL: String { get }
var uploadParams: [String: AnyObject]? { get }
func updateSyncState()
}
extension Syncable where Self: MyManagedObject {
func updateSyncState() {
}
}
extension Model: Syncable {
var uploadURL: String {
return "a url"
}
var uploadParams: [String: AnyObject]? {
return [:]
}
}
那是因为 Swift 知道什么是协议扩展。但是 Objective-C 没有!因此,一旦您说 @objc protocol
就将协议移入 Objective-C 世界,并且协议扩展无效 - 因此模型不符合,因为它没有 updateSyncState
实现.