我可以使用Swift 2中该类中的函数定义的变量初始化类吗?

时间:2015-11-22 16:52:37

标签: swift class initializer

初始化我的类的变量是否可能由该类中的函数计算?

我首先初始化MyClass:

let MyClass = MyClass()

其次,这将是该类中的代码:

class MyClass {
    var myString = computeRandomString()

    func computeRandomString() -> String {
        piece of code
        return(randomString)
    }
}

每当我创建MyClass的实例时,我希望myString是randomString。为了这个,我在同一个班级里创造了一个功能。

3 个答案:

答案 0 :(得分:3)

有两种选择。

首先,如果computeRandomString不依赖于了解该类的特定实例的任何内容,则可以将其转换为类函数,或者只是完全移出类。

例如:

class MyClass {
    var myString = MyClass.computeRandomString()

    class func computeRandomString() -> String {
        return "random string"
    }
}

func computeRandomString() -> String {
    return "random string"
}

class MyClass {
    var myString = computeRandomString()
}

第二个选项是在初始值设定项中设置它(而不是给它一个默认值),但是你只能在所有值之后(包括这个值)执行此操作已经分配了一个值。

例如:

class MyClass {
    var myString: String

    init() {
        myString = ""
        myString = computeRandomString()
    }

    func computeRandomString() -> String {
        return "random string"
    }
}

我们不能使用实例方法为实例变量分配默认值的原因可以通过在初始化器中首次为其赋值之前尝试使用实例方法时生成的警告来更好地解释: / p>

class MyClass {
    var myString: String

    init() {
        myString = computeRandomString()
    }

    func computeRandomString() -> String {
        return "random string"
    }
}

myString =的{​​{1}} ...行中,我们看到以下错误:

  

使用' self'在方法调用' computeRandomString'在初始化所有存储的属性之前。

遗憾的是,当我们将其用作属性的默认值时,此错误并未显示,正如您尝试的那样,但它确实准确地描述了实际问题。

在我们的类完全初始化之前,我们不能使用init,包括在self上调用方法。并且在我们的所有存储属性都具有有效值之前,我们的实例未完全初始化,因此我们永远不能使用实例方法为非可选存储属性提供其第一个值。

答案 1 :(得分:0)

可能的解决方案是懒惰的计算属性 第一次访问该属性时会创建该字符串

class MyClass {

  lazy var computeRandomString : String = {
    let alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789"
    let alphaLength = UInt32(alphabet.characters.count)
    var randomString : String = ""
    for _ in 0..<20 {
      let random = Int(arc4random_uniform(alphaLength))
      let index = alphabet.startIndex.advancedBy(random)
      randomString += String(alphabet[index])
    }
     return randomString
  }()
}

for _ in 0..<10 {
  print(MyClass().computeRandomString)
}

答案 2 :(得分:-2)

你必须这样做:

int n;
int cache[n][n];

这会在class MyClass { var myString: String init() { self.myString = MyClass.computeRandomString() } static func computeRandomString() -> String { piece of code return(randomString) } } - 对象的初始化(创建)时将myString设置为computeRandomString()的结果。

我将MyClass更改为静态,因为在初始化完成之前无法使用它,这要归功于@nhgrif。