我刚遇到一个奇怪的问题
我有一个名为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)
时,我需要一个由func loadFromFile
返回的新对象。如何在init方法中分配或返回一个新对象?
//编辑 同样的问题......
答案 0 :(得分:2)
返回该类实例的类函数似乎是Swift中的反模式。您会注意到"与"像[NSString stringWithString:@"some other string"]
这样的Objective-C类方法使用" -less方便初始化器进行了转换:NSString(string: "some other string")
。
此外,您需要在便捷初始化程序中delegate to a designated initializer。
此外,由于您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的类比是调用初始化器。
请告诉我这是否适合您!
答案 1 :(得分:1)
它说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的实例 -
答案 2 :(得分:0)
你无法分配给自己。这样的事情怎么样:
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)
}
}