[英]NSDictionary FBGraphUser Swift translation
I stumbled upon this piece of Objective-C code: 我偶然发现了这段Objective-C代码:
- (void)updateUser:(NSDictionary<FBGraphUser> *)user inSlot:(NSInteger)slot {
[self validateSlotNumber:slot];
NSString *idKey = [NSString stringWithFormat:SUUserIDKeyFormat, (long)slot];
NSString *nameKey = [NSString stringWithFormat:SUUserNameKeyFormat, (long)slot];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (user != nil) {
NSLog(@"SUUserManager updating slot %li: fbid = %@, name = %@", (long)slot, user.objectID, user.name);
[defaults setObject:user.objectID forKey:idKey];
[defaults setObject:user.name forKey:nameKey];
} else {
NSLog(@"SUUserManager clearing slot %li", (long)slot);
// Can't be current user anymore
if (slot == _currentUserSlot) {
[self switchToNoActiveUser];
}
// FBSample logic
// Also need to tell the token cache to forget the tokens for this user
FBSessionTokenCachingStrategy *tokenCachingStrategy = [self createCachingStrategyForSlot:slot];
[tokenCachingStrategy clearToken];
[defaults removeObjectForKey:idKey];
[defaults removeObjectForKey:nameKey];
}
[defaults synchronize];
[self sendNotification];
}
It is from one of the Facebook iOS SDK examples. 它来自Facebook iOS SDK示例之一。 I am trying to use it in my Swift written app.
我正在尝试在我的Swift书面应用程序中使用它。 This is what I come up with:
这是我想出的:
func updateUser(user: Dictionary<String, FBGraphUser>, slot: Int) {
var idKey: String = String(format: userIDKeyFormat, slot)
var nameKey: String = String(format: userNameKeyFormat, slot)
var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
if(user != nil) {
println("UserManager updating slot \(slot): Facebook ID = \(user.objectID), Name = \(user.name)")
defaults.setObject(user.objectID, forKey: idKey)
defaults.setObject(user.name, forKey: nameKey)
} else {
println("UserManager clearing slot \(slot)")
if(slot == currentUserSlot) {
self.switchToNoActiveUser()
}
var tokenCachingStrategy: FBSessionTokenCachingStrategy = self.createCachingStrategyForSlot(slot)
tokenCachingStrategy.clearToken()
defaults.removeObjectForKey(idKey)
defaults.removeObjectForKey(nameKey)
}
defaults.synchronize()
self.sendNotification()
}
The problem is in Dictionary<String, FBGraphUser>
which, I think, is just not the same as the Obj-C equivalent. 问题出在
Dictionary<String, FBGraphUser>
中,我认为这与Obj-C等效项不同。 In the if statement to check if user
is not nil, Xcode throws an error: 'Dictionary' is not convertible to 'String'. 在用于检查
user
是否为nil的if语句中,Xcode引发错误:'Dictionary'无法转换为'String'。
So how do I translate the Obj-C code to Swift? 那么如何将Obj-C代码转换为Swift?
Thanks! 谢谢!
您必须将字典设置为可选:
func updateUser(user: Dictionary<String, FBGraphUser>?, slot: Int) {...}
After some extensive research I finally found a way: 经过大量研究,我终于找到了一种方法:
func updateUser<val: NSDictionary where val:protocol<FBGraphUser>>(user:val!, slot: Int) {
var idKey: String = String(format: userIDKeyFormat, slot)
var nameKey: String = String(format: userNameKeyFormat, slot)
var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
if(user != nil) {
println("UserManager updating slot \(slot): Facebook ID = \(user!.objectID), Name = \(user!.name)")
defaults.setObject(user!.objectID, forKey: idKey)
defaults.setObject(user!.name, forKey: nameKey)
} else {
println("UserManager clearing slot \(slot)")
if(slot == currentUserSlot) {
self.switchToNoActiveUser()
}
var tokenCachingStrategy: FBSessionTokenCachingStrategy = self.createCachingStrategyForSlot(slot)
tokenCachingStrategy.clearToken()
defaults.removeObjectForKey(idKey)
defaults.removeObjectForKey(nameKey)
}
defaults.synchronize()
self.sendNotification()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.