提问者:小点点

Swift不能在类初始化方法中分配给self


我有一个类叫

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”是不可变的


共3个答案

匿名用户

返回该类实例的类函数似乎是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的类比是调用初始化器。

让我知道这是否适合你!

匿名用户

  1. 方便初始化器必须委托给指定的初始化器

它说便利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)
    }
}