从Swift NSObject子类遵循Objective-C协议的问题
这段代码在Swift 1.1中绝对正常
// Obj-C @import Foundation; @protocol HashableObject <NSObject> - (NSUInteger)hash; @end // Swift import Foundation @objc class Object: NSObject, HashableObject { func hash() -> UInt { return 0 } }
然而,在最新的Swift 1.2和Xcode 6.3beta2中,编译器抱怨Method'hash Method 'hash()' overrides Objective-C method 'hash' from superclass 'NSObject'
这是一个错误,或者其他的东西已经根本改变了,代码是错的? 有没有任何解决办法呢? 在我的代码中有很多东西需要符合Objective-C库中的某些协议,并且除了等待下一个Swift版本之外,基本上没有任何明显的解决scheme。
NSObject
已经具有hash
属性 :
protocol NSObjectProtocol { var hash: Int { get }
而且,Swift 1.2检测到这些错误的覆盖。 从发行说明:
Swift现在检测到Swifttypes系统中的重载和重写之间的差异以及通过Objective-C运行时看到的有效行为。 (18391046,18383574)
例如,现在诊断出类中的“属性”的Objective-C setter与其扩展中的“setProperty”方法之间存在以下冲突:
class A : NSObject { var property: String = "Hello" // note: Objective-C method 'setProperty:' // previously declared by setter for // 'property' here } extension A { func setProperty(str: String) { } // error: method 'setProperty' // redeclares Objective-C method //'setProperty:' }
在Swift 1.2(Xcode 6.3 beta 2)中,你可以覆盖NSObject
的hash
属性作为一个计算属性:
class Object: NSObject { override var hash: Int { return 0 } }