当前位置: 首页 > 面试题库 >

快速字典中作为键的引用

蒋高扬
2023-03-14
问题内容

字典键要求Hashable符合性:

class Test {}
var dictionary = [Test: String]() // Type 'Test' dies not conform to protocol 'Hashable'

class Test: NSObject {}
var dictionary = [Test: String]() // Works

如何获得纯Swift类实例的地址用作hashValue


问题答案:

可以将相等实现为对象标识,即a == biff
ab引用该类的相同实例,并且可以从构造哈希值ObjectIdentifier(对于相同的对象,该值相同,请比较,例如,使用ObjectIdentifier()和’===’运算子

对于Swift 4.2及更高版本:

class Test : Hashable {
    static func ==(lhs: Test, rhs: Test) -> Bool {
        return lhs === rhs
    }

    public func hash(into hasher: inout Hasher) {
        hasher.combine(ObjectIdentifier(self))
    }
}

对于Swift 3:

class Test : Hashable {
    var hashValue: Int { return ObjectIdentifier(self).hashValue }
}

func ==(lhs: Test, rhs: Test) -> Bool {
    return lhs === rhs
}

对于Swift 2.3及更早版本,您可以使用

/// Return an UnsafePointer to the storage used for `object`.  There's
/// not much you can do with this other than use it to identify the
/// object
func unsafeAddressOf(object: AnyObject) -> UnsafePointer<Void>

class Test : Hashable {
    var hashValue: Int { return unsafeAddressOf(self).hashValue }
}

func ==(lhs: Test, rhs: Test) -> Bool {
    return lhs === rhs
}

例:

var dictionary = [Test: String]()
let a = Test()
let b = Test()
dictionary[a] = "A"
print(dictionary[a]) // Optional("A")
print(dictionary[b]) // nil

实施Equatable协议。



 类似资料:
  • 问题内容: 尝试使用字典中的键快速填充字符串。 这将返回错误:’AnyObject’与字符串不同 也试过了 但得到:’String’不能转换为[String] 问题答案: Swift 3和Swift 4

  • 问题内容: 我有以下快速字典 我如何访问数组值? 上面的代码给出了错误“找不到成员下标” 它应该打印“书” 问题答案: 请注意,返回可选的。我们必须强制展开: 或使用可选的链接

  • 问题内容: 我正在尝试复制在目标C中执行的for循环,但遇到“’AnyObject’没有名为’GeneratorType’的成员错误: 这是我的雨燕 我试过为字典定义一个holder变量。任何人都可以看到我在做什么错吗? 问题答案: 这不是字典的循环。它循环通过存储在其中一个字典键中的数组。例如,如果您有一个字符串数组作为字典的键之一,这就是想要做的事情。 如果您确实想只遍历字典,这在Swift中

  • 问题内容: 在此页面上,我看到了一些有趣的东西: 请注意,有一种快速的命令可以(实际上)仅处理str键。 这不会影响算法的复杂性,但是会显着影响以下恒定因素:典型程序完成的速度。 那到底是什么意思呢? 这是否意味着使用字符串作为键总是更快? 如果是,为什么? 更新: 感谢您提供有关优化的建议!但实际上,我对简单的事实更感兴趣,而不是是否或何时进行优化。 更新2: 感谢您的出色回答,在这里我将引用@

  • 问题内容: 我正在开发一类分析微量滴定板的课程。样本在单独的文件中描述,并且条目用于有序词典。关键之一是pH,通常以浮点数给出。例如6.8 我可以将其导入为十进制,以避免将浮点数作为dict键。另一种解决方案是将点替换为例如6p8之类的p或在我的样本描述中写入6p8,从而从一开始就消除了问题。但这会在以后引起麻烦,因为我无法在图中绘制6p8的pH值。 您将如何解决这个问题? 问题答案: 使用浮点数

  • 问题内容: 我想创建一个python字典,将字典中缺少的键的键值返回给我。 用法示例: 问题答案: 对此有一个钩子: