首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果Swift KeyPath的类型是KeyPath<Root,Value!>,如何从它获得底层值?

如果Swift KeyPath的类型是KeyPath<Root,Value!>,如何从它获得底层值?
EN

Stack Overflow用户
提问于 2017-11-02 06:04:23
回答 1查看 695关注 0票数 5

看看下面的代码:

代码语言:javascript
复制
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

我们可以解决以下问题:

代码语言:javascript
复制
func bind<T, V>(keypath: WritableKeyPath<T, ImplicitlyUnwrappedOptional<V>>) {
}

不幸的是,文档中说ImplicitlyUnwrappedOptional是不可取的。但是,它并没有被标记为不推荐使用@available属性。

我不太愿意使用一种文档认为不推荐的类型,但是我找不到其他方法来完成我所需要的事情。

  1. Value类型为WritableKeyPath<T, V!>时,是否有另一种方法从WritableKeyPath获得隐式包装的泛型WritableKeyPath<T, V!>类型?
  2. ImplicitlyUnwrappedOptional会在某个时候被移除吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-02 12:18:00

Value类型为WritableKeyPath<T, V!>时,是否有另一种方法从WritableKeyPath中获得隐式包装的泛型WritableKeyPath<T, V!>类型?

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

相反,\Something.s应该是一个WritableKeyPath<T, V?>,所以真正的原始代码应该编译。这个问题一直是在这里被登记为一个bug

ImplicitlyUnwrappedOptional会在某个时候被移除吗?

是的,这是由SE-0054提出的

因为IUO是声明上的属性,而不是类型上的属性,所以删除了ImplicitlyUnwrappedOptional类型以及长表单ImplicitlyUnwrappedOptional<T>语法。不再允许使用嵌套IUO的类型。这包括[Int!](Int!, Int!)等类型。

然而,对于Swift 4,这种类型检查器的实现还没有完全实现,这就是为什么您仍然能够使用ImplicitlyUnwrappedOptional作为类型来解决您的问题。不过,它已经在Swift 5中实现了,因此您的解决方案将不再在其发行版上编译。

虽然希望IUO的关键路径错误将被修复到那时。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47068630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档