Phosphophyllite

情報系学部に通う雑魚学生の日常・進捗・疑問ブログ

【Swift】tupleをiterate的に扱いたい

Obejctive-Cで書かれたAPISwiftから呼び出すと、おぶしーの方では配列で返ってきているようなのにSwiftにはタプルで返ってくる…だと……!?ということがあったので、なんとかタプルで返ってきたものをiterateで扱えないか苦戦して、今一番すっきり書けるのがこんな感じでした。
とりあえずFaceなんて構造体を定義した例を使ってみましたが、実際にはfacesみたいなのが返ってきて「んあ゛あ゛あ゛あ゛」ってしました。
タプルのままではどうしても無理だったので、リフレクティングを使って配列に全部入れ直してfor文で取り出せるようになります。
もっとすっきりした方法ないのかなって探し中。

// Face構造体
struct Face {
    var age: Int = 25
    var sex: String = "male"
}

let face_1 = Face(age: 50, sex: "male")
let face_2 = Face(age: 45, sex: "female")
let face_3 = Face(age: 34, sex: "female")
let face_4 = Face(age: 35, sex: "male")

// Face構造体の集まりのタプル. APIからこんな形で返ってきてた。
let faces = (face_1, face_2, face_3, face_4)

// リフレクティング
let mirror = Mirror(reflecting: faces)
// Face達の格納用の配列を用意
var array = [Face]()

// valueに入っているFaceを取り出してarrayに入れなおす
mirror.children.map {
    print("label : \($0.label!), value : \($0.value)")
    // label : .0, value : Face(age: 50, sex: "male")

    let f = $0.value as! Face
    array.append(f)
}

// こんな風に取り出せる
for x in array {
    print(x.age)
    print(x.sex)
/*
50
male
45
female
34
female
35
male
*/
}