Swift不能在类init方法中为self赋值



我有一个名为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的类比是调用初始化器。

如果这对你有用,请告诉我!

  1. 便利初始化器必须委托到指定的初始化器

它说convenience init(file_path:String)应该调用其他初始化程序

convenience init(file_path:String) {
  self.init()
  //here can set other properties
}
  1. 方便初始化程序通常提供一些默认参数

方便的初始化程序是为了使类实例的创建不那么复杂而设计的。这意味着您不需要将所有参数传递给构造函数。在你的例子中,类应该看起来像这个

  • 指定的初始值设定项接受所有可能的参数
  • 方便提供默认值

代码示例

// 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)
    }
}

最新更新