gpt4 book ai didi

swift - 当类型为 KeyPath 时,如何从 Swift KeyPath 获取基础值?

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

看看下面的代码:

struct Something {
var s: String! // Implicitly Unwrapped Optional
}

func bind<T, V>(keyPath: WritableKeyPath<T, V?>) {
}

bind(\Something.s)

上面的代码无法编译。如果我们更改 bind 的签名至 bind<T, V>(keyPath: WritableKeyPath<T, V>)然后它确实编译了,但问题是 V 的类型是String!我需要获取基础类型,在本例中为 String .

我们可以这样解决问题:

func bind<T, V>(keypath: WritableKeyPath<T, ImplicitlyUnwrappedOptional<V>>) {
}

不幸的是文档说ImplicitlyUnwrappedOptional已弃用。但是,它没有被标记为已弃用 @available属性。

我犹豫要不要使用文档中说的已弃用的类型,但我找不到其他方法来完成我需要的。

  1. 是否有另一种方法来获取隐式包装的泛型 ValueWritableKeyPath 输入当它的类型是 WritableKeyPath<T, V!>
  2. 威尔 ImplicitlyUnwrappedOptional在某个时候被删除?

最佳答案

Is there another way to get the implicitly wrapped generic Value type from a WritableKeyPath when its type is WritableKeyPath<T, V!>?

据我所知不是。这里真正的问题是 \Something.s 不应该WritableKeyPath<T, V!> .根据 SE-0054 规定的规则,这应该是非法的(IUO 是声明的属性;它们不是可以满足通用占位符的实际类型)。

相反,\Something.s应该是 WritableKeyPath<T, V?> ,所以你的原始代码真的应该编译。此问题已filed as a bug here .

Will ImplicitlyUnwrappedOptional be removed at some point?

是的,这是SE-0054规定的:

Because IUOs are an attribute on declarations rather than on types, the ImplicitlyUnwrappedOptional type, as well as the long form ImplicitlyUnwrappedOptional<T> syntax, is removed. Types with nested IUOs are no longer allowed. This includes types such as [Int!] and (Int!, Int!).

然而,Swift 4 并未完全实现类型检查器实现,这就是为什么您仍然可以使用 ImplicitlyUnwrappedOptional 的原因作为一种类型来解决您的问题。 It has been implemented for Swift 5 though ,因此您的解决方法将不再在其发布时编译。

尽管 IUO key 路径错误有望在那时得到修复。

关于swift - 当类型为 KeyPath<Root, Value!> 时,如何从 Swift KeyPath 获取基础值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47068630/

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