我对Swift很新,当我学习初始化字符串时,我找到了一个我无法理解的有线语法。
例如 如果我使用:
初始化字符串 var str:String = "Hello, playground"
str.isEmpty
这很好用
但是,如果我使用构造函数初始化字符串
var str = String("Hello, playground")
str.isEmpty
这不起作用。 编译器通过将语法更改为
来修复它str?.isEmpty
我不知道那是什么“?”。 任何建议表示赞赏。
答案 0 :(得分:2)
当你说:
let str = String("Hello, playground")
您正在使用String
的{{3}}初始化程序,它满足init?(_ description: String)
的初始化程序要求,因为并非所有符合此类型的任意> string(例如,Double
)。
因为初始化器是可用的,它会返回一个可选的字符串实例(即String?
),因此编译器会提示您使用可选链接(如果还没有,我强烈建议您阅读LosslessStringConvertible
})。
然而值得注意的是绝对不需要String
的初始化器的实现是可用的 - 因为字符串总是代表一个字符串!这个optionals section of the language guide,它将被实现为满足可用要求的不可用的初始化器。这是因为它不会破坏与返回新实例或 nil
的协议的契约(它恰好从未碰巧执行后者)。
然而,在同一时间,你可以强制解包结果,因为它总会成功。但实际上在这里使用初始化器是完全多余的。您应该使用字符串文字,例如在第一个示例中:
let str = "Hello, playground"
str
将简单地初始化为具有字符串文字内容的非可选String
实例。请注意,Swift可以推断 str
为String
类型 - 您无需明确注释它。
答案 1 :(得分:0)
var str = String(" Hello,playground")
这产生了所谓的"可选"。在Swift中,如果某些内容可以为null / nil,那么它将包含在Optional中。 '?'尝试解包可选项并生成一个String。
如果您知道该值永远不能为null,那么您可以强行打开它:
var str = String("Hello, playground")
str!.isEmpty
或
var str2 = String("Hello, playground")!
str2.isEmpty
一般情况下,强行解缠是不受欢迎的,因为它可能会导致崩溃。更好的方法:
struct MyError:Error {
var message:String
}
guard let str3 = String("Hello, playground") else {
throw MyError(message:"failed")
}
str3.isEmpty
if let str4 = String("Hello, playground") {
str4.isEmpty
}