Swift无法在方法中分配给self

时间:2014-10-18 13:30:03

标签: swift init

我刚遇到一个奇怪的问题

我有一个名为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方法中分配或返回一个新对象?

//编辑 同样的问题......

3 个答案:

答案 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)

  1. 便捷初始化程序必须委托指定的初始化程序
  2. 它说convenience init(file_path:String)应该调用其他初始化

    convenience init(file_path:String) {
      self.init()
      //here can set other properties
    }
    
    1. 便捷初始化程序通常会提供一些默认参数
    2. 便捷初始化程序旨在使类实例的创建不那么复杂。这意味着您不需要将所有参数传递给构造函数。在您的示例中,类应该如下所示

      • 指定初始化程序会获取所有可能的参数。
      • 便利性提供默认值

      代码示例

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