Swift – 在编译时创build一个固定长度的数组

我想执行(编译时间)数组与5特定types的元素

我无法find一个解决scheme,所以通过创build一个元组来解决这个问题

(这是我知道的辱骂)

typealias FiveElementArray = (MyType,MyType,MyType,MyType,MyType) // mock array by using typed tuple 

它适用于我的需要 – 直到我需要在运行时通过索引访问元素。

例如:

 var DB = FiveElementArray // the tuple of 5 elements tableView(tableView : UITableView,cellForRowAtIndexPath:indexPath) -> UITableViewCell { // would like to populate with the value at index DB[indexpath.row] // no such syntax for tuples } 

那么我怎样才能使用静态types长度的适当的swift数组

防止对值types(如数组)进行不必要更改的方法是将didSet观察者放在其上以作为警戒:

 var arr = [1, 2, 3, 4, 5] { didSet { if arr.count > 5 {arr = oldValue} } } arr.append(6) println(arr) // [1, 2, 3, 4, 5], that change was illegal arr[2] = 100 println(arr) // [1, 2, 100, 4, 5], that change was legal 

但是,如果这不够好,你将需要使用包装,即有一个数组而不是一个数组:

 struct FiveElementArray<T> { private var arr = Array<T>() // methods for access go here } 

“访问方法”可以包括修改你所允许的数组的所有方法(例如,下标)的实现,并且可以简单地不实现你不允许的所有方法(例如追加和扩展)。

如果你坚持一个编译时检查,那么就坚持你的元组,甚至写你自己的集合。 但在那个时候,我认为你只是在愚蠢的要求你。 结构包装可防止不必要的更改; 这是一个保证,所以不需要在编译时做出保证。

您可能正在寻找依赖types :它使您能够将某个值(数组长度)编码到types本身中。 幸运的是,在某种程度上可以在Swift中使用依赖types。

@oisdk也写了一篇博客文章 ,他创build了一个高效的依赖types的集合结构,您还可以在与Playground版本中的代码交互的同时阅读文章。

用法示例:

 func onlySameLength<A, B, L : Nat>(lhs: ConstArray<A, L>, rhs: ConstArray<B, L>) {} let twoLong = emptyArray() +| 1 +| 2 // [1, 2] let twoChar = emptyArray() +| "a" +| "b" // ["a", "b"] onlySameLength(twoLong, rhs: twoChar) let threeInts = emptyArray() +| 1 +| 2 +| 3 // [1, 2, 3] //Uncomment for an error //onlySameLength(twoLong, rhs: threeInts) 

我强烈build议使用Swift的types推断作为具有元素String和计数为3ConstArray的types,将是ConstArray<String, Succ<SuccSucc<<Zero>>>>

好的,像[1, 2].lazy.filter {$0 == 1 }.flatMap{ [$0] }types为LazyCollection<FlattenCollection<LazyMapCollection<LazyFilterCollection<Array<Int>>, [Int]>>> ,so我猜ConstArray不算太坏:P