在Swift中进行子类化时,如何覆盖NSObject的description属性?

时间:2014-11-12 17:59:58

标签: macos cocoa swift foundation

我是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 ...

访问该属性

2 个答案:

答案 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属性,所以我猜你省略了更多的代码,而不仅仅是下标方法。)