【问题标题】:How can I override the description property of NSObject when subclassing in Swift?在 Swift 中进行子类化时,如何覆盖 NSObject 的描述属性?
【发布时间】:2014-11-12 17:59:57
【问题描述】:

我对@9​​87654322@ 进行子类化,以便拥有一个可供 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 访问该属性...

【问题讨论】:

  • 你不能。泛型类与 Objective-C 不兼容。
  • 我了解泛型类与 ObjC 不兼容。尽管如此,文档中没有任何内容(至少我已经找到)说你不能用泛型子类化 ObjC 类以在 Swift 中使用,事实上它不会抱怨(并且会编译)直到我覆盖描述。

标签: macos cocoa swift foundation


【解决方案1】:

似乎答案在一个完全不同的问题的 cmets 中。 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],但这可能对将来的某些人有用。

【讨论】:

    【解决方案2】:

    要在 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 属性,所以我猜你省略的代码不仅仅是下标方法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 2013-09-07
      相关资源
      最近更新 更多