Swift 比较集

Swift Compare Set

我尝试检查 FB 权限,如下所示:

let permissions = ["user_friends", "public_profile"];
NSLog("Contains Permissions:%@", FBSDKAccessToken.currentAccessToken()
        .permissions);
    NSLog("Requested Permissions:%@", permissions);


    if(!FBSDKAccessToken.currentAccessToken().permissions.contains(permissions)){
        return false;
    }else{
        return true;
    }

但它总是 returns 错误。有人知道为什么吗?

编辑:日志输出

Contains Permissions:{(
"user_friends",
"public_profile"
)}
2015-10-28 23:01:59.723: Requested Permissions:(
"user_friends",
"public_profile"
)

您可以更改:

if(!FBSDKAccessToken.currentAccessToken().permissions.contains(permissions))

至:

if FBSDKAccessToken.currentAccessToken().permissions.containsObject("user_friends") && FBSDKAccessToken.currentAccessToken().permissions.containsObject("public_profile")

很多set的解决方案,见示例代码:

let permisssion = NSSet(array:["user_friends", "public_profile"])
    let test = NSSet(array: ["user_friends", "email","public_profile"])

    if permisssion.isSubsetOfSet(test as Set<NSObject>) {
        print("true")
    } else {
        print("false")
    }

您使用的 contains() 函数检查 'current Access Token' 权限的任何元素是 permissions 的数组。它总是 false 因为令牌权限是字符串,而不是字符串数组。

如果两个数组需要有完全相同的元素,那么最简单的代码就是:

let permissions = ["user_friends", "public_profile"];
NSLog("Contains Permissions:%@", FBSDKAccessToken.currentAccessToken()
        .permissions);
NSLog("Requested Permissions:%@", permissions);

tokenPermissions = FBSDKAccessToken.currentAccessToken().permissions as? [String]
return tokenPermissions != nil && tokenPermissions.sort().elementsEqual(permissions.sort())

您可能首先反对使用 sort(),也许是因为矫枉过正,但否则您将多次遍历两个权限列表,因此 sort() 最终不会成为这样的问题。

另一种选择是遍历 tokenPermissions 并确保每个人都在 permissions 中。像这样:

for tokenPermission in tokenPermissions {
  if !permissions.contains (tokenPermission) {
    return false
  }
}
return true

或者,如果您非常有野心并且需要进行大量序列测试:

extension SequenceType {
  public func any (@noescape predicate: (Self.Generator.Element) -> Bool) -> Bool {
    for elt in self {
      if predicate (elt) { return true }
    }
    return false
  }

  public func all (@noescape predicate: (Self.Generator.Element) -> Bool) -> Bool {
    for elt in self {
      if !predicate (elt) { return false }
    }
    return true
  }
}

然后您的代码包含:

return tokenPermissions.all { permissions.contains ([=13=]) }

最后,如果这两个权限数组实际上是权限集,那么您可以使用

return Set(tokenPermissions).elementsEqual(Set(permissions))

所以你有很多选择。

您可能正在寻找的是

let permissions = ["user_friends", "public_profile"]

let tokenPermissions = FBSDKAccessToken.currentAccessToken().permissions

NSLog("Contains Permissions:%@", tokenPermissions)
NSLog("Requested Permissions:%@", permissions)

guard let tokenPermissions = tokenPermissions as? Set<String> else {
    return false
}

return tokenPermissions.isSupersetOf(permissions)

对于 isSupersetOf(_:) 语法,请参阅 Swift Collection Types,您需要将未类型化的 NSSet 转换为 Swift Set<String> 才能使函数正常工作。