我有一个名为Letter
的类
class Letter
{
init() {}
}
我有一个这个类的扩展:
extension Letter
{
convenience init(file_path:String) {
self = Letter.loadFromFile(file_path)
}
class func loadFromFile(file_path:String)->Letter {...}
}
我需要创建和初始化文件的路径,当我调用Letter(file_path)
时,我需要一个由函数loadFromFile
返回的新对象。如何在init方法中赋值或返回一个新对象?
它给出了错误:
无法赋值:"self"是不可变的
返回该类实例的类函数似乎是Swift中的反模式。您会注意到,像[NSString stringWithString:@"some other string"]
这样的"with"Objective-C类方法将转换为"with"不太方便的初始化器:NSString(string: "some other 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的类比是调用初始化器。
如果这对你有用,请告诉我!
- 便利初始化器必须委托到指定的初始化器
它说convenience 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()
}
}
现在您可以通过这种方式创建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)
}
}