Swift 无法在类 init 方法中分配给 self

Ole*_*rov 5 init swift

我有一堂课叫Letter

class Letter
{    
    init() {}
}
Run Code Online (Sandbox Code Playgroud)

我对这个类有一个扩展:

extension Letter
{
    convenience init(file_path:String) {
       self = Letter.loadFromFile(file_path)
    }

    class func loadFromFile(file_path:String)->Letter {...}
}
Run Code Online (Sandbox Code Playgroud)

我需要使用文件路径创建和初始化,当我调用时,Letter(file_path)我需要一个由 func 返回的新对象loadFromFile。如何在 init 方法中赋值或返回一个新对象?

它给出了错误:

无法赋值:“self”是不可变的

And*_*rew 2

返回该类实例的类函数似乎是 Swift 中的反模式。您会注意到“with”Objective-C 类方法像[NSString stringWithString:@"some other string"]“with”-less 便利初始化器一样进行了转换:NSString(string: "some other string")

\n\n

此外,您需要从便利初始化程序中委托给指定的初始化程序。

\n\n

另外,由于您 1) 定义原始类,并且 2) 不需要范围与指定初始值设定项不同的便利初始值设定项,所以我认为没有任何理由将其放置在扩展中。

\n\n

将它们放在一起:

\n\n
class Letter {\n    init() { \xe2\x80\xa6 }\n\n    convenience init(filePath: String) {\n        self.init()\n        loadFromFile(filePath)\n    }\n\n    func loadFromFile(filePath: String) { \xe2\x80\xa6 }\n}\n\nlet letter1 = Letter()\nletter1.loadFromFile("path1")\n\nlet letter2 = Letter(filePath: "path2")\n
Run Code Online (Sandbox Code Playgroud)\n\n

总之,在 Swift 中分配给 self 的类比就是调用初始化器。

\n\n

让我知道这是否适合您!

\n