【发布时间】:2014-11-12 02:40:43
【问题描述】:
尝试使用 Equatable 协议中定义的“==”运算符比较两个 AnyObject 类型的对象会导致 Swift 中的编译错误。在不知道可用于向下转换的对象的真实类型的情况下,是否有人找到了比较此类对象的方法?
这个问题的背景是我有一个字典 Dictionary
编辑 这是一个演示该问题的 sn-p。
@objc(FooObject)
public class FooObject: NSManagedObject {
@NSManaged public var properties: Dictionary<String, AnyObject>
public subscript(property: String) -> AnyObject? {
get {
return properties[property]
}
set(newValue) {
for propertyValue in properties.values {
if propertyValue == newValue { // This line is not compiling: Cannot invoke '==' with AnyObject
println("Values in are expected to be unique!")
// Throw an exception here ...
}
}
properties[property] = newValue
}
}
}
注意在类定义中声明的像
【问题讨论】:
-
AnyObject在添加到Dictionary之前是什么?解决此问题的理想方法是首先不使用AnyObject,可能是通过创建自定义protocol或enum并改用它。 -
这些值是
AnyObject类型,因为它们是从外部提供的,并且可以是任何类型,就像在 Objective-C 中一样,您可以将任何值作为值,例如字符串、数字、数据等。我在考虑一个协议,但它并没有解决问题。枚举呢? -
enums 和 Associated Values 可能是一个很好的解决方案。半相关:stackoverflow.com/a/25863986/3300036 -
迈克,我已经用一些细节更新了这个问题。正如您所看到的,枚举并不是我所需要的,因为可能可以作为值存储在字典中的类型非常多。另一个问题是字典被用作 NSManagedObject 属性。
标签: swift comparison