我是 Swift 的新手,当我学习初始化字符串时,我发现了一个我无法理解的连线语法。
例如 如果我使用以下方法初始化一个字符串:
var str:String = "Hello, playground"
str.isEmpty
这很好用
但是,如果我用构造函数初始化一个字符串
var str = String("Hello, playground")
str.isEmpty
这是行不通的。 编译器通过将语法更改为
来修复它str?.isEmpty
我不知道那个“?”是什么?为了。 任何建议表示赞赏。
最佳答案
当你说:
let str = String("Hello, playground")
您正在使用 String
的 init?(_ description: String)
初始化程序,满足 LosslessStringConvertible
的初始化器要求,因为并非所有符合的类型都具有任意 字符串的表示(例如,Double
)。
因为初始化程序是可失败的,它返回一个可选的字符串实例(即 String?
),因此编译器提示您使用可选链接的原因(如果还没有,我强烈建议阅读optionals section of the language guide ).
然而,值得注意的是,绝对String
的此初始化程序的实现不需要是可失败的——因为一个字符串总是可以表示一个字符串!这will be fixed in Swift 4 ,它将被实现为满足可失败要求的不可失败初始化器。这是因为它不会破坏与返回新实例 或 nil
协议(protocol)的约定(它永远不会碰巧返回后者)。
然而与此同时,您可以强制解包结果,因为它总是会成功。但实际上在这里使用初始化程序是完全多余的。您应该使用字符串文字,例如在您的第一个示例中:
let str = "Hello, playground"
str
将被简单地初始化为一个非可选的 String
实例,其中包含字符串文字的内容。请注意,Swift 可以推断 str
为String
类型——您不需要显式地这样注释它。
关于swift 3.0 关于String初始化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44209066/