一尘不染

Swift结构初始化,制作另一个类似String的结构

swift

在Swift上String是一个 结构体 ,您可以使用以下命令对其进行初始化

var someString:String = "Hello"

我将如何使另一个Struct初始化为String?

例如

struct StringV2 {
    init()
}

class SomeClass {
    let someStringV2:StringV2 = "Hello"
}

由于这就是String代码的样子。


阅读 229

收藏
2020-07-07

共1个答案

一尘不染

(在我看来)这是语言的简洁部分。是的,这要归功于该ExpressibleByStringLiteral协议。

不幸的是,这有些复杂。ExpressibleByStringLiteral从继承ExpressibleByExtendedGraphemeClusterLiteral,这本身继承ExpressibleByUnicodeScalarLiteral。因此,要符合第一个,您必须符合上方的其他两个。

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

  • A UnicodeScalarLiteralType(例如UnicodeScalar,是一个Unicode代码点,例如"A"
  • 一个ExtendedGraphemeClusterLiteralType(例如Character,是的集合UnicodeScalar,例如"🐥"
  • A 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)
2020-07-07