将字典中的范围附加到Swift中的数组

时间:2016-01-22 18:26:24

标签: arrays swift dictionary range

这有效:

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 。我无法弄清楚如何将如图所示的字典附加到数组中。这是可能的,如果是的话,怎么样?

非常感谢提前!

3 个答案:

答案 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值的每次使用而增加