这有效:
var aArray = [ Int ]()
let aRange = ( 0 ... 5 )
aArray.appendContentsOf( aRange )
并为 aArray 生成 [0,1,2,3,4,5] 。
然而:
enum Dog {
case Snoopy
case Lassie
case Scooby
}
let dogRange = [ Dog.Snoopy : ( 0 ... 5 ), Dog.Lassie : ( 6 ... 11 ), Dog.Scooby : ( 12 ... 17 ) ]
var dArray = [ Int ]()
dArray.appendContentsOf( dogRange[ Dog.Snoopy ] )
在Playground中抛出预期的类型为'(C)'的参数列表,无法调用非函数类型的值'[Dog:ClosedInterval]' Xcode中的一个项目。
dogRange[ Dog.Snoopy ]
按预期在Playground中生成 0 ..< 6 。我无法弄清楚如何将如图所示的字典附加到数组中。这是可能的,如果是的话,怎么样?
非常感谢提前!
答案 0 :(得分:3)
问题是dogRange[ Dog.Snoopy ]
会生成Range<Int>?
类型的可选项。为了使用它,你需要打开它:
enum Dog {
case Snoopy
case Lassie
case Scooby
}
let dogRange = [ Dog.Snoopy : ( 0 ... 5 ), Dog.Lassie : ( 6 ... 11 ), Dog.Scooby : ( 12 ... 17 ) ]
var dArray = [ Int ]()
if let aDog = dogRange[ Dog.Snoopy ] { // unwrap the optional
dArray.appendContentsOf( aDog )
}
答案 1 :(得分:3)
Swift Dictionaries总是返回Optionals。错误消息有点误导,但您只需要解包:
if let snoopyRange = dogRange[ Dog.Snoopy ] {
dArray.appendContentsOf( snoopyRange )
}
并且没有更多错误。
答案 2 :(得分:0)
'替代'(更实用)方式
enum Dog {
case Snoopy
case Lassie
case Scooby
}
let dogRangeDict = [ Dog.Snoopy : ( 0 ... 5 ), Dog.Lassie : ( 6 ... 11 ), Dog.Scooby : ( 12 ... 17 ) ]
let dogRange = dogRangeDict.sort { (dr1, dr2) -> Bool in
dr1.0.hashValue < dr2.0.hashValue
}.map { (dr) -> [Int] in
Array(dr.1)
}
print(dogRange[Dog.Lassie.hashValue]) // [6, 7, 8, 9, 10, 11]
print(dogRange[Dog.Scooby.hashValue]) // [12, 13, 14, 15, 16, 17]
所以最后dogRange不是Dog.xy可索引的Dictionary,而是Dog.xy.hashValue可索引的不可变(线程安全)数组。您需要每次解包字典值,在下一个代码中需要它。只有在展开它的范围内才能访问此值。 Dog.xy.hashValue可索引的不可变数组的优势将随着dogRange值的每次使用而增加