我正在尝试声明一个静态大小的数组。我想要一个常量来定义数组的大小。
我在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)
答案 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,因为它很方便,但不是必需的。没有问题声明一个函数的数组。我仍然使用一个函数来创建数组,并使用另一个函数来改变一个值。