Swift结构初始化,使另一个结构像String.Swift CCD_1上的



是一个结构,您可以使用对其进行初始化

var someString:String = "Hello"

如何使另一个Struct可以像String一样初始化?

例如

struct StringV2 {
    init()
}
class SomeClass {
    let someStringV2:StringV2 = "Hello"
}

因为String的代码就是这样的。

在我看来,这是语言的一部分。是的,这是可能的,这要归功于ExpressibleByStringLiteral协议。

不幸的是,它有一些复杂性。ExpressibleByStringLiteral继承自ExpressibleByExtendedGraphemeClusterLiteral,而CCD_5本身又继承自ExpressibleByUnicodeScalarLiteral。因此,要符合第一个,你必须符合上面的其他2个

这使得您的结构或类可以从以下位置初始化:

  • UnicodeScalarLiteralType(例如UnicodeScalar,它是单个Unicode码点,例如"A"(
  • String0(例如Character,它是UnicodeScalar的集合,例如"🐥"(
  • StringLiteralType(例如String,它是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)

最新更新