【问题标题】:hash() and description() not allowed in Xcode 6.3 for NSObjectNSObject 在 Xcode 6.3 中不允许 hash() 和 description()
【发布时间】:2015-04-11 07:57:29
【问题描述】:

在我的 Swift 库 EVCloudKitDao 中,我做了很多反射。因此,我将数据对象的基类设置为 NSObject。现在升级到 Xcode 6.3 后,我在获取哈希和对象描述的 2 个函数上遇到错误。描述函数很不错,但我确实需要哈希来使我的对象与 Set 一起工作。

这是我的代码

public class EVCloudKitDataObject : NSObject, NSCoding, Printable, Hashable, Equatable {

    public func hash() -> Int {
        return self.hashValue
    }
    public func description() -> String {
        return EVReflection.description(self)
    }
}

我得到的错误是:

/Users/evermeer/Desktop/dev/GitHub/EVCloudKitDao/AppMessage/AppMessage/CloudKit/EVCloudKitDataObject.swift:106:17: 带有 Objective-C 选择器“hash”的方法“hash()”与 getter 冲突 对于具有相同 Objective-C 的超类“NSObject”的“哈希” 选择器

/Users/evermeer/Desktop/dev/GitHub/EVCloudKitDao/AppMessage/AppMessage/CloudKit/EVCloudKitDataObject.swift:86:17: 方法 'description()' 和 Objective-C 选择器'description' 与来自超类“NSObject”的“描述”的 getter 冲突 使用相同的 Objective-C 选择器

有谁知道我该如何解决这个问题? 您不能使用覆盖。

【问题讨论】:

标签: swift reflection overloading nsobject


【解决方案1】:

正如错误所说,在这两种情况下,属性和方法之间都存在命名冲突。最明显的修复方法是将您的 2 个方法转换为属性:

public override var hash: Int {
    return self.hashValue
}

public override var description: String {
    return EVReflection.description(self)
}

也可以写成:

public override var hash:Int {
    get {
        return self.hashValue
    }
}
public override var description : String {
    get {
        return EVReflection.description(self)
    }
}

它在之前的版本中起作用的原因很可能是因为:

Swift 现在可以检测 Swift 类型系统中的重载和覆盖与通过 Objective-C 运行时看到的有效行为之间的差异。

release notes 中了解更多信息(搜索1839104618383574

【讨论】:

  • 奇怪的是,在 Xcode 6.2 中它确实使用这些作为方法。如您所说,我现在已将其更改为属性,现在一切正常。谢谢!
  • 我认为这是因为一些语言修复 - 阅读更新的答案
猜你喜欢
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多