gpt4 book ai didi

swift - Int 和 String 如何被接受为 AnyHashable?

转载 作者:搜寻专家 更新时间:2023-10-30 23:05:11 24 4
gpt4 key购买 nike

我怎么可以这样做?

    var dict = [AnyHashable : Int]()
dict[NSObject()] = 1
dict[""] = 2

这意味着 NSObjectString 在某种程度上是 AnyHashable子类型AnyHashable 是一个 struct 那么,他们如何允许这样做呢?

最佳答案

考虑 Optional 是一个 enum ,这也是一种值类型——但您可以自由地转换 StringOptional<String> .答案很简单,编译器会隐式地为您执行这些转换。

如果我们查看以下代码发出的 SIL:

let i: AnyHashable = 5

我们可以看到编译器插入了对 _swift_convertToAnyHashable 的调用:

  // allocate memory to store i, and get the address.
alloc_global @main.i : Swift.AnyHashable, loc "main.swift":9:5, scope 1 // id: %2
%3 = global_addr @main.i : Swift.AnyHashable : $*AnyHashable, loc "main.swift":9:5, scope 1 // user: %9

// allocate temporary storage for the Int, and intialise it to 5.
%4 = alloc_stack $Int, loc "main.swift":9:22, scope 1 // users: %7, %10, %9
%5 = integer_literal $Builtin.Int64, 5, loc "main.swift":9:22, scope 1 // user: %6
%6 = struct $Int (%5 : $Builtin.Int64), loc "main.swift":9:22, scope 1 // user: %7
store %6 to %4 : $*Int, loc "main.swift":9:22, scope 1 // id: %7

// call _swift_convertToAnyHashable, passing in the address of i to store the result, and the address of the temporary storage for the Int.
// function_ref _swift_convertToAnyHashable
<b> %8 = function_ref @_swift_convertToAnyHashable : $@convention(thin) <τ_0_0 where τ_0_0 : Hashable> (@in τ_0_0) -> @out AnyHashable, loc "main.swift":9:22, scope 1 // user: %9</b>
%9 = apply %8<Int>(%3, %4) : $@convention(thin) <τ_0_0 where τ_0_0 : Hashable> (@in τ_0_0) -> @out AnyHashable, loc "main.swift":9:22, scope 1

// deallocate temporary storage.
dealloc_stack %4 : $*Int, loc "main.swift":9:22, scope 1 // id: %10

正在寻找AnyHashable.swift , 我们可以看到 silgen 名称为 _swift_convertToAnyHashable 的函数,它只是调用 AnyHashable 's initialiser .

@_silgen_name("_swift_convertToAnyHashable")
public // COMPILER_INTRINSIC
func _convertToAnyHashable<H : Hashable>(_ value: H) -> AnyHashable {
return AnyHashable(value)
}

因此上面的代码等价于:

let i = AnyHashable(5)

尽管标准库 also implements an extension 很奇怪对于 Dictionary (which @OOPer shows ), 允许带有 Key 的字典类型 AnyHashable由任何 _Hashable 订阅符合类型(我不相信有任何类型符合 _Hashable ,但不符合 Hashable )。

下标本身应该可以正常工作而无需对 _Hashable 进行特殊重载。键。相反,默认下标(将采用 AnyHashable 键)可以仅用于上述隐式转换,如以下示例所示:

struct Foo {
subscript(hashable: AnyHashable) -> Any {
return hashable.base
}
}

let f = Foo()
print(f["yo"]) // yo

编辑:在 Swift 4 中,上述下标重载和 _Hashable已被 this commit 从 stdlib 中删除与描述:

We have an implicit conversion to AnyHashable, so there's no need to have the special subscript on Dictionary at all.

这证实了我的怀疑。

关于swift - Int 和 String 如何被接受为 AnyHashable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42021207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com