在Swift上String是一个 结构体 ,您可以使用以下命令对其进行初始化
String
var someString:String = "Hello"
我将如何使另一个Struct初始化为String?
例如
struct StringV2 { init() } class SomeClass { let someStringV2:StringV2 = "Hello" }
由于这就是String代码的样子。
(在我看来)这是语言的简洁部分。是的,这要归功于该ExpressibleByStringLiteral协议。
ExpressibleByStringLiteral
不幸的是,这有些复杂。ExpressibleByStringLiteral从继承ExpressibleByExtendedGraphemeClusterLiteral,这本身继承ExpressibleByUnicodeScalarLiteral。因此,要符合第一个,您必须符合上方的其他两个。
ExpressibleByExtendedGraphemeClusterLiteral
ExpressibleByUnicodeScalarLiteral
这样就可以从以下位置初始化您的结构或类:
UnicodeScalarLiteralType
UnicodeScalar
"A"
ExtendedGraphemeClusterLiteralType
Character
"🐥"
StringLiteralType
Characters
"This is a string"
这是一个仅设置String成员变量的示例实现:
struct StringV2: ExpressibleByStringLiteral { let s: String init(unicodeScalarLiteral: UnicodeScalar) { s = String(unicodeScalarLiteral) } init(extendedGraphemeClusterLiteral: Character) { s = String(extendedGraphemeClusterLiteral) } init(stringLiteral: String) { s = stringLiteral } } let s1: StringV2 = "This is a string" // String print(s1.s) let s2: StringV2 = "A" // Unicode scalar print(s2.s) let s3: StringV2 = "🐥" // Extended grapheme cluster print(s3.s)