【问题标题】:How does append function work in Swift?append 函数在 Swift 中是如何工作的?
【发布时间】:2015-04-14 06:29:58
【问题描述】:

谁能解释一下这句话有什么问题。

var someString = "Welcome"
someString.append("!")

但是,当我将代码替换为时,这会起作用,

var someString = "Welcome"
let exclamationMark : Character = "!"
someString.append(exclamationMark)

提前致谢

【问题讨论】:

    标签: ios string swift append


    【解决方案1】:

    在 Swift 中,没有字符字面量(例如 C 派生语言中的 'c'),只有 String 字面量。

    然后,您在Strings 上定义了两个函数:append,用于附加单个字符,extend,用于附加整个字符串。所以这行得通:

    var someString = "Welcome"
    someString.extend("!")
    

    如果您真的想使用append,您可以通过调用Character 的构造函数来强制将单字符String 文字转换为Character

    someString.append(Character("!"))
    

    或使用类型转换:

    someString.append("!" as Character)
    

    或者像使用额外变量一样使用类型注释:

    let exclamationMark: Character = "!"
    someString.append(exclamationMark)
    

    【讨论】:

      【解决方案2】:

      String 有 2 个重载 append(_:)

           mutating func append(x: UnicodeScalar)
           mutating func append(c: Character)
      

      CharacterUnicodeScalar 都符合 UnicodeScalarLiteralConvertible

      enum Character : ExtendedGraphemeClusterLiteralConvertible, Equatable, Hashable, Comparable {
      
          /// Create an instance initialized to `value`.
          init(unicodeScalarLiteral value: Character)
      }
      
      struct UnicodeScalar : UnicodeScalarLiteralConvertible {
      
          /// Create an instance initialized to `value`.
          init(unicodeScalarLiteral value: UnicodeScalar)
      }
      

      "!" 在这种情况下是UnicodeScalarLiteral。所以,编译器无法判断"!"Character还是UnicodeScalar,应该调用哪个append(_:)方法。这就是为什么您必须明确指定它的原因。


      您可以看到:"!" 可以通过此代码成为 UnicodeScalar 文字:

      struct MyScalar: UnicodeScalarLiteralConvertible {
          init(unicodeScalarLiteral value: UnicodeScalar) {
              println("unicode \(value)")
          }
      }
      
      "!" as MyScalar // -> prints "unicode !"
      

      【讨论】:

      • 正式地说,"!" 实际上是一个包含单个 Unicode 标量值的 String 文字。 UnicodeScalarLiteralConvertible 的标头 cmets 声明:“可以使用包含单个 Unicode 标量值的字符串文字来初始化符合类型”。
      • 实际上(很抱歉,我很挑剔——我会编辑我的评论,但不能再编辑了),"!" 恰好不是 UnicodeScalar,否则someString.append("!") 会立即编译。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      相关资源
      最近更新 更多