我是NSObject
的子类,以便拥有Cocoa Bindings可以访问的有序集合。我的班级或多或少看起来像这样:
public class OrderedCollection<Tk: Hashable, Tv> : NSObject {
var keys: Array<Tk> = []
var values: Dictionary<Tk,Tv> = [:]
override init() {
super.init()
}
// Subscript methods go here
override public var description: String {
var result = "{\n"
for i in 0..<self.count {
result += "[\(i)]: \(self.keys[i]) => \(self[i]!)\n"
}
result += "}"
return result
}
}
它无法编译。错误说明:'@objc' getter for non-'@objc' property
。
有没有办法让getter非''@ objc'原样?我不需要从Objective-C ...
访问该属性答案 0 :(得分:0)
似乎答案是在一个完全不同的问题的评论中。 https://stackoverflow.com/a/26688572/4180258
基本上,有一个丑陋的解决方法:
class BaseNSObjectWithDescriptionFix: NSObject { func makeDescription() -> String { return super.description } override var description: String { return makeDescription() } }
现在您只需使用BaseNSObjectWithDescriptionFix而不是NSObject,并根据需要覆盖makeDescription。
在我的情况下,我不需要它,因为出于我的目的,我可以使用[String]
和[String:AnyObject]
,但这可能对将来的某些人有用。
答案 1 :(得分:0)
要在Swift中进行子类化时覆盖NSObject的description属性,使用两种类似的通用类型并将类保持公开,只需要:
public class OrderedCollection<Tk: Hashable, Tv>: NSObject {
override public var description: String {
return "hello"
}
}
相反,您也可以符合CustomStringConvertible
协议(以前称为Swift 2之前,称为Printable
)并忘记NSObject,如下所示:
public class OrderedCollection<Tk: Hashable, Tv>: CustomStringConvertible {
public var description: String {
return "hello"
}
}
换句话说,对于这种情况,泛型并没有真正改变任何东西。 (不确定早期版本的Swift中的内容是否有所不同......)
我留给你description
的内容(例如,你上面没有count
属性,所以我猜你省略了更多的代码,而不仅仅是下标方法。)