Учитывая массив [Any]
, который содержит сочетание необязательных и необязательных значений, например:
let int:Int? = 1
let str:String? = "foo"
let values:[Any] = [int,2,str,"bar"]
Как мы можем извлечь значение Optional
в типе Any
(если оно есть), чтобы мы могли создать общую функцию печати, которая выводит только значения.
например. эта функция printArray проходит и печатает каждый элемент:
func printArray(values:[Any]) {
for i in 0..<values.count {
println("value[\(i)] = \(values[i])")
}
}
printArray(values)
Будет выводиться:
value[0] = Optional(1)
value[1] = 2
value[2] = Optional("foo")
value[3] = bar
Как мы можем изменить его, чтобы он печатал только базовое значение, чтобы оно разворачивало значение, если оно необязательно? например:
value[0] = 1
value[1] = 2
value[2] = foo
value[3] = bar
Обновление прогресса...
Он может работать при изменении аргумента на [Any?]
, например:
let values:[Any?] = [int,2,str,"bar"]
func printArray(values:[Any?]) {
for i in 0..<values.count {
println("value[\(i)] = \(values[i]!)")
}
}
printArray(values)
Будет напечатано желаемое:
value[0] = 1
value[1] = 2
value[2] = foo
value[3] = bar
Но хотелось бы посмотреть, как мы можем развернуть опцию из Any
, так как это возвращает MirrorType.value
, что затрудняет извлечение необязательного значения, например:
class Person {
var id:Int = 1
var name:String?
}
var person = Person()
person.name = "foo"
var mt:MirrorType = reflect(person)
for i in 0 ..< mt.count {
let (name, pt) = mt[i]
println("\(name) = \(pt.value)")
}
Распечатывает:
id = 1
name = Optional("foo")
Когда мне нужно:
id = 1
name = foo