Swift:使用constant属性来定义另一个属性失败

时间:2014-10-25 15:15:24

标签: swift

我正在尝试声明一个静态大小的数组。我想要一个常量来定义数组的大小。

我在Swift中尝试以下内容

class foo {
    let size = 10
    let myArray = [Int](count: size, repeatedValue: 0)
}

但这失败了,错误,

'foo.Type' does not have a member named 'size'       

如果我不使用大小常量,编译器会对它感到满意,但不是我想要的。并且没有我所知道的#define功能。

let myArray = [Int](count: 10, repeatedValue: 0)

4 个答案:

答案 0 :(得分:3)

Swift为您提供了几种方法。最简单,最符合您提到的#define样式的是将size声明为全局常量:

let FOOSIZE = 10

class Foo {
    let myArray = [Int](count: FOOSIZE, repeatedValue: 0)
}

或者,您可以将myArray定义为惰性变量,并使用闭包来填充其值。在执行关闭时,您将能够访问self.size

class Foo {
    let size = 10
    lazy var myArray: [Int] = { [Int](count: self.size, repeatedValue: 0) }()
}

答案 1 :(得分:3)

在swift self中,在初始化所有类/结构属性之前,它是不可用的,并且已经调用了子类初始化程序(如果是继承的类)。

在您的情况下,您正在初始化初始化程序之外的属性,但这不会更改结果:您无法初始化隐式引用self的变量(在访问size属性时执行此操作)。

但是,size看起来像一个常量,因此最好将它实例化一次(作为静态属性),而不是在每个类实例中创建它。 Swift不支持静态类属性,但结构不支持,所以一个技巧是定义一个内部私有结构,包含您可能需要的静态不可变属性:

class foo {
    private struct Static {
        static let size = 10
    }

    let myArray = [Int](count: Static.size, repeatedValue: 0)
}

答案 2 :(得分:1)

使用Swift 1.2,你可以在let之前添加静态,使它成为一个类常量,并在定义myArray之前定义:

class foo {
    static let size = 10
    let myArray = [Int](count: size, repeatedValue: 0)
}

请注意,稍后在代码中使用尺寸要求您将其完全限定为foo.size

答案 3 :(得分:0)

一种方法是使它成为一种功能。这在一个操场上工作:

import UIKit

class ViewController: UIViewController {

    var myArray = [Int]()

    func appendArray (#index: Int, value: Int) {
        myArray[index] = value
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        let size = 10
        myArray = [Int](count: size, repeatedValue: 0)
        appendArray(index: 3, value: 4)
        println(myArray)

    }
}

好的,我使用了ViewController,因为它很方便,但不是必需的。没有问题声明一个函数的数组。我仍然使用一个函数来创建数组,并使用另一个函数来改变一个值。