swift 中 NSString 的便捷初始化器

anu*_*nuj 3 swift

当我尝试在 NSString 上快速创建便利初始化程序时,它失败了

错误:无法分配给值:“self”是不可变的 self =“(数字)”

extension NSString {
  public init(for number: Int) {
    self = "\(number)"
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然 String 上的类似扩展也有效

extension String {
  public init(for number: Int) {
    self = "\(number)"
  }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 5

NSString是一个(引用类型),String是一个结构体 (值类型),它们具有不同的初始化规则。

值类型(structenum)不支持继承并且具有更简单的初始化规则。特别是,您可以通过分配给 来初始化值self

extension String {
    public init(for number: Int) {
        self = "\(number)"
    }
}
Run Code Online (Sandbox Code Playgroud)

类初始化是一个两阶段的过程,以防止属性值在初始化之前被访问。它必须遵循某些规则,其中之一是便利初始值设定项必须委托给相同类型的另一个初始值设定项(并最终委托给指定的初始值设定项):

extension NSString {
    public convenience init(for number: Int) {
        self.init(string: "\(number)")
    }
}
Run Code Online (Sandbox Code Playgroud)

与 Objective-C 相反,Swift(还?)不支持“工厂初始化”,您可以在其中创建并返回类或某个子类的实例,而不是初始化self.

有关详细信息,请参阅“Swift 编程语言”参考中的初始化。