&引用;无法分配类型为';字符串';输入';任何对象?'&引用;,Swift 3,Xcode 8 beta 6
一段相当简单的代码&引用;无法分配类型为';字符串';输入';任何对象?'&引用;,Swift 3,Xcode 8 beta 6,swift,Swift,一段相当简单的代码 var dict: [String: AnyObject] = [:] dict["key"] = "value" 生成以下编译时错误 Cannot assign value of type 'String' to type 'AnyObject?' 简单的类型检查告诉我String是AnyObject "value" is AnyObject // returns true 我可以将AnyObject更改为Any,一切都可以正常工作 var dict: [String
var dict: [String: AnyObject] = [:]
dict["key"] = "value"
生成以下编译时错误
Cannot assign value of type 'String' to type 'AnyObject?'
简单的类型检查告诉我String
是AnyObject
"value" is AnyObject // returns true
我可以将AnyObject
更改为Any
,一切都可以正常工作
var dict: [String: Any] = [:]
dict["key"] = "value"
但我想知道为什么我会出错?
String
不再是AnyObject
?或者这是一个bug?在b6中,字符串不再神奇地连接到NSString。String不是一个类;这是一个结构。您需要手动完成桥接:
dict["key"] = "value" as AnyObject
是
这一事实似乎仍在起桥梁作用,这很可能是一个bug,应该报告
不用说,[String:AnyObject]
和[String:Any]
应该在代码中尽可能少地使用
(请确保遵循Hamish在下面评论中提供的链接。)在b6中,字符串不再神奇地连接到NSString。String不是一个类;这是一个结构。您需要手动完成桥接:
dict["key"] = "value" as AnyObject
是
这一事实似乎仍在起桥梁作用,这很可能是一个bug,应该报告
不用说,[String:AnyObject]
和[String:Any]
应该在代码中尽可能少地使用
(请务必遵循哈米什在下面评论中提供的链接。)我将补充一些官方来源
以下Swift发展提案中接受了取消隐式桥接机制,该提案将在Swift 3中实施
Int
,字符串
)
出于这个原因,我们决定作出妥协。我们需要
从桥接目标C转换时,显式桥接强制转换
输入到其关联的Swift值类型(例如,NSString->String),
但不是相反
。。。[来自SE-0072]
使用Swift 3,这种隐式转换机制将不再可用
随着去年Objective-C仿制药的推出
所有对API导入的出色改进都适用于Swift
3.我想是时候让我们再看一眼了
工作
我建议我们完全消除
Swift 3。这意味着一些用户可能需要引入
在他们的代码中有更显式的强制转换,但我们会删除另一个特殊的
案例来自Swift的类型系统,能够进一步简化
编译器
以前依赖Swift之间的隐式转换的代码
现在将显示值类型及其关联的桥接目标-C类型
需要通过as
cast进行手动强制
最后,(需要登录)声明该提案已在beta 6中实施:
在Xcode 8 beta 6中新增-Swift编译器:Swift语言
- 桥接转换不再是隐式的。可以使用
强制将Swift值类型转换为相应的对象。 例如:as
。任何Swift值也可以是 转换为其装箱id表示形式,并将字符串作为NSString
。 (SE-0072)作为AnyObject
AnyObject
,例如,请参见以下线程:
- 我将补充一些官方资料
以下Swift发展提案中接受了取消隐式桥接机制,该提案将在Swift 3中实施
Int
,字符串
)
出于这个原因,我们决定作出妥协。我们需要
从桥接目标C转换时,显式桥接强制转换
输入到其关联的Swift值类型(例如,NSString->String),
但不是相反
。。。[来自SE-0072]
使用Swift 3,这种隐式转换机制将不再可用
随着去年Objective-C仿制药的推出
所有对API导入的出色改进都适用于Swift
3.我想是时候让我们再看一眼了
工作
我建议我们完全消除
Swift 3。这意味着一些用户可能需要引入
在他们的代码中有更显式的强制转换,但我们会删除另一个特殊的
案例来自Swift的类型系统,能够进一步简化
编译器
以前依赖Swift之间的隐式转换的代码
现在将显示值类型及其关联的桥接目标-C类型
需要通过as
cast进行手动强制
最后,(需要登录)声明该提案已在beta 6中实施:
在Xcode 8 beta 6中新增-Swift编译器:Swift语言
- 桥接转换不再是隐式的。可以使用
强制将Swift值类型转换为相应的对象。 例如:as
string作为NSString