swift 3.0 关于String初始化的问题

标签 swift string

我是 Swift 的新手,当我学习初始化字符串时,我发现了一个我无法理解的连线语法。

例如 如果我使用以下方法初始化一个字符串:

 var str:String = "Hello, playground"
    str.isEmpty

这很好用

但是,如果我用构造函数初始化一个字符串

var str = String("Hello, playground")
str.isEmpty

这是行不通的。 编译器通过将语法更改为

来修复它
str?.isEmpty

我不知道那个“?”是什么?为了。 任何建议表示赞赏。

最佳答案

当你说:

let str = String("Hello, playground")

您正在使用 Stringinit?(_ 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 可以推断 strString 类型——您不需要显式地这样注释它。

关于swift 3.0 关于String初始化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44209066/

相关文章:

Swift:防止玩家地址跟踪

java - 从字符串中获取标记之间的字符串

c - 为什么 printf() 中的命令\r 不起作用?

ios - Alamofire 文件上传出现错误 "JSON text did not start with array or object and option to allow fragments not set"

swift - 401 alamofire 获取带有 header 的请求

ios - Collection View 的全屏 View

r - 统计这个因子中 "0"的个数

c - AWK 或 C 中的字符串操作

java - 基于注释的字符串验证

swift - 无法从框架内部使用自定义 View