将字典键与数组进行比较以提取匹配和非匹配数据

时间:2016-01-16 11:35:37

标签: ios arrays swift

我正在尝试检索Facebook好友列表并显示用户是否跟随其他用户。为此,我使用存储在解析后端的FacebookID,当用户点击“关注”按钮时,我将他的FacebookId添加到解析中的“关注”键值。稍后我将检索以下关键数组并显示当前用户正在关注或未关注的用户。

我的朋友名单:

var friend = ["902165525": "John", "10204125099": "Sam", "153822": "Sandy", "475585616": "Nito"]

我正在关注:

var follow = ["10204125099", "153822"]

现在我想提取friend数组,在那里我可以看到我“没有关注”的朋友,即else块。

wantToGetThis -> ["902165525": "John", "475585616": "Nito"]

我拥有的是,

    func check() {

    for all in self.follow {

        for (key, value) in friend {

            if key.containsString(all) {

                print("Yes: \(key), \(value)")

            } else {
                print("No: \(key), \(value)")

            }
        }
    }
}

这是if循环

的结果
Yes: 10204125099, Sam

Yes: 153822, Sandy

这是else循环

的结果
No: 153822, Sandy

No: 902165525, John

No: 475585616, Nito

No: 902165525, John

No: 10204125099, Sam

No: 475585616, Nito

为什么我会在else区块和多个John和Nito中获得Sandy和Sam?这里有什么问题?

2 个答案:

答案 0 :(得分:1)

你不应该在内循环中打印任何东西。相反,您应该使用它来查看是否有任何项目与外部循环中的当前项目匹配,并在循环结束后打印结果:

for (key, value) in friend {
    var found = false
    for all in self.follow {
        if key == all {
            found = true
            break
        }
    }
    if found {
        print("Yes: \(key), \(value)")
    } else {
        print("No: \(key), \(value)")
    }
}

请注意,循环的顺序也应该更改:内部循环应该变为外部,以便在内部循环结束后保留​​对keyvalue的访问权限。

答案 1 :(得分:1)

Swift的filter函数可以应用于字典,键/值对被视为元组。

let peopleIFollow = friend.filter{ follow.contains($0.0) }
let peopleIDontFollow = friend.filter{ !follow.contains($0.0) }
for person in peopleIFollow {
  print("I follow \(person.0) \(person.1)")
}
for person in peopleIDontFollow {
  print("I don't follow \(person.0) \(person.1)")
}