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>
才能使函数正常工作。
我尝试检查 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>
才能使函数正常工作。