Swift新手:NSObject类声明属性遇「无初始化器」错误求解
解决Swift中NSObject子类无初始化器的报错问题
嗨,刚从Objective-C转Swift的话确实会碰到这个小问题,我来帮你梳理清楚怎么搞定它~
你遇到的Class 'item' has no initializer报错,核心原因是Swift对类的存储属性有严格的初始化要求:所有存储属性必须在实例创建完成时拥有确定的值,要么提前给默认值,要么在初始化方法里赋值。而你继承了NSObject,但既没给属性设默认值,也没写初始化方法,所以编译器就报错了。
下面给你几种符合Objective-C使用习惯的解决方案:
方案1:给属性设置默认值
这和Objective-C里属性默认初始化(对象类型为nil,基本类型为0)的逻辑最接近,直接给每个属性指定初始值即可:
import UIKit // 注意:Swift类名建议首字母大写,这是官方命名规范哦 class Item: NSObject { var topSpeed: Double = 0.0 var aStrProperty: String = "" var anIntProperty: Int = 0 }
这样你就可以直接创建实例,后续再修改属性值,和Objective-C的使用方式完全一致。
方案2:自定义初始化方法
如果希望在创建实例时就给属性赋值,可以写一个自定义的初始化器,注意Swift里子类初始化的顺序:先给自己的属性赋值,再调用父类的init()方法:
import UIKit class Item: NSObject { var topSpeed: Double var aStrProperty: String var anIntProperty: Int // 自定义初始化方法,接收参数给属性赋值 init(topSpeed: Double, aStrProperty: String, anIntProperty: Int) { // 先初始化子类自己的存储属性 self.topSpeed = topSpeed self.aStrProperty = aStrProperty self.anIntProperty = anIntProperty // 再调用父类的初始化方法 super.init() } }
使用的时候就可以这样创建实例:
let myItem = Item(topSpeed: 200.0, aStrProperty: "Test", anIntProperty: 10)
方案3:使用可选类型允许属性为nil
如果有些属性可能暂时没有值,可以把它们声明为可选类型(用?标记),可选类型的默认值是nil,这样也不需要额外写初始化器:
import UIKit class Item: NSObject { var topSpeed: Double? var aStrProperty: String? var anIntProperty: Int? }
这种方式类似Objective-C里的nullable属性,后续你可以给属性赋值,或者判断是否为nil再使用。
另外补充个小建议:Swift里类名首字母大写是惯例(比如Item而非item),这样代码可读性更好,也符合官方的编码规范。
你完全可以继续使用NSObject子类,Swift对这种写法是完全支持的,不用被迫切换到结构体~
内容的提问来源于stack exchange,提问作者user6631314
相关产品推荐
相关产品推荐

