我有一个类叫信
class Letter
{
init() {}
}
我有这个类的扩展:
extension Letter
{
convenience init(file_path:String) {
self = Letter.loadFromFile(file_path)
}
class func loadFromFile(file_path:String)->Letter {...}
}
我需要创建和init与路径文件,当我调用信(file_path)
我需要一个新的对象,返回由funcloadFromFile
.如何分配在init方法或返回一个新的对象?
它给出了错误:
无法赋值:“self”是不可变的
返回该类实例的类函数似乎是Swift中的反模式。您会注意到“with”Objective-C类方法,如[NSString stringWellString:@"一些其他字符串"]
将转换为“with”-less便利初始化器:NSString(string:"一些其他字符串")
。
此外,您需要从便利初始化程序中委托给指定的初始化程序。
此外,由于您1)定义了原始类并且2)不需要与指定初始化器不同的方便初始化器范围,因此我看不出有任何理由将其放在扩展中。
把这些放在一起:
class Letter {
init() { … }
convenience init(filePath: String) {
self.init()
loadFromFile(filePath)
}
func loadFromFile(filePath: String) { … }
}
let letter1 = Letter()
letter1.loadFromFile("path1")
let letter2 = Letter(filePath: "path2")
总之,在Swift中分配给self的类比是调用初始化器。
让我知道这是否适合你!
它说便利init(file_path: String)
应该调用其他初始化程序
convenience init(file_path:String) {
self.init()
//here can set other properties
}
方便初始化程序旨在使类实例的创建不那么复杂。这意味着您不需要将所有参数传递给构造函数。在您的示例中,类应该如下所示
代码示例
// Create instance of a Letter
Letter()
Letter(file_path: "path.txt")
Letter(file_path: "path.txt", option: 0, other: 0)
//Class Implementation
class Letter
{
init(file_path: String , option: Int, other: Int) {
// Instansiate class
}
}
extension Letter {
convenience init() {
self.init(file_path:"a")
}
convenience init(file_path:String) {
self.init(file_path: file_path , option: 0, other: 0)
}
class func loadFromFile(file_path:String) -> Letter {
return Letter()
}
}
现在您可以通过这种方式创建信的实例-
你不能给self赋值。像这样的东西怎么样:
class Letter {
}
extension Letter {
convenience init(filePath: String) {
self.init()
// code to load a Letter from a file goes here.
}
class func loadFromFile(filePath: String) -> Letter {
return Letter(filePath: filePath)
}
}