当我尝试在swift中在NSString上创建Convenience初始化程序时,它失败了
错误:无法赋值:'self'是不可变的 self =“(数字)”
extension NSString {
public init(for number: Int) {
self = "\(number)"
}
}
虽然String上有类似的扩展名
extension String {
public init(for number: Int) {
self = "\(number)"
}
}
答案 0 :(得分:4)
NSString
是类(引用类型),String
是结构
(值类型),这些具有不同的初始化规则。
值类型(struct
和enum
)不支持继承并具有
更简单的初始化规则。特别是,您可以初始化一个
分配给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>