Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;无法分配类型为';字符串';输入';任何对象?'&引用;,Swift 3,Xcode 8 beta 6_Swift - Fatal编程技术网

&引用;无法分配类型为';字符串';输入';任何对象?'&引用;,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中实施

以前,可以从一些Swift本机类型到关联的Objective-C类型进行隐式转换(符合专用协议的Swift类型\u ObjectiveBridgeable,例如本机
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语言

  • 桥接转换不再是隐式的。可以使用
    as
    强制将Swift值类型转换为相应的对象。 例如:
    字符串作为NSString
    。任何Swift值也可以是 转换为其装箱id表示形式,并将
    作为AnyObject
    。 (SE-0072)
W.r.t.新的“盒式id”,允许将任何Swift值显式转换为
AnyObject
,例如,请参见以下线程:

    • 我将补充一些官方资料


      以下Swift发展提案中接受了取消隐式桥接机制,该提案将在Swift 3中实施

      以前,可以从
      一些Swift本机类型
      到关联的Objective-C类型进行隐式转换(符合专用协议的Swift类型\u ObjectiveBridgeable,例如本机
      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语言

      • 桥接转换不再是隐式的。可以使用
        as
        强制将Swift值类型转换为相应的对象。 例如:
        string作为NSString