Swift结构初始化,使另一个结构像String

时间:2016-11-02 06:34:52

标签: swift xcode struct initialization

Swift String上的

结构,你可以使用

初始化它
var someString:String = "Hello"

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

例如

struct StringV2 {
    init()
}

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

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

1 个答案:

答案 0 :(得分:5)

这是(在我看来)整洁的语言部分。是的,由于ExpressibleByStringLiteral协议,这是可能的。

不幸的是,它有一些复杂性。 ExpressibleByStringLiteral继承自ExpressibleByExtendedGraphemeClusterLiteralExpressibleByUnicodeScalarLiteral本身继承自traceback。因此,为了符合第一个,你必须符合它上面的其他2。

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

  • 一个UnicodeScalarLiteralType(例如UnicodeScalar,这是一个单一的Unicode代码点,例如"A"
  • ExtendedGraphemeClusterLiteralType(例如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)