看看下面的代码:
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属性。
我不太愿意使用一种文档认为不推荐的类型,但是我找不到其他方法来完成我所需要的事情。
Value类型为WritableKeyPath<T, V!>时,是否有另一种方法从WritableKeyPath获得隐式包装的泛型WritableKeyPath<T, V!>类型?ImplicitlyUnwrappedOptional会在某个时候被移除吗?发布于 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的关键路径错误将被修复到那时。
https://stackoverflow.com/questions/47068630
复制相似问题