在swift中NSString上的便捷初始化程序

时间:2017-08-15 03:59:55

标签: swift

当我尝试在swift中在NSString上创建Convenience初始化程序时,它失败了

  

错误:无法赋值:'self'是不可变的       self =“(数字)”

extension NSString {
  public init(for number: Int) {
    self = "\(number)"
  }
}

虽然String上有类似的扩展名

extension String {
  public init(for number: Int) {
    self = "\(number)"
  }
}

2 个答案:

答案 0 :(得分:4)

NSString(引用类型),String结构 (值类型),这些具有不同的初始化规则。

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

extension String {
    public init(for number: Int) {
        self = "\(number)"
    }
}

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

extension NSString {
    public convenience init(for number: Int) {
        self.init(string: "\(number)")
    }
}

与Objective-C相反,Swift不支持“工厂初始化”,你可以创建并返回一个实例 类或某些子类,而不是初始化self

有关详细信息,请参阅“The Swift Programming Language”参考中的Initialization

答案 1 :(得分:-1)

String是一种不可变类型,这意味着您无法更改它。它正在抛出错误,因为你正在设置它自己。但是,extension NSString { public convenience init(for number: Int) { self.init(string: "\(number)") } } 类型是可变的,因此不会抛出错误。

试试这个。

<div>
{this.state.users.map(user => {
  return <p> {user.prop} </p>
})}
</div>

Working code in Swift Sandbox