NSDictionary FBGraphUser Swift 翻译
NSDictionary FBGraphUser Swift translation
我偶然发现了这段 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];
}
它来自 Facebook iOS SDK 示例之一。我正在尝试在我的 Swift 编写的应用程序中使用它。这是我想出的:
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()
}
问题出在 Dictionary<String, FBGraphUser>
中,我认为这与 Obj-C 等效项不同。在检查 user
是否为 nil 的 if 语句中,Xcode 抛出错误:'Dictionary' is not convertible to 'String'.
那么如何将 Obj-C 代码转换为 Swift?
谢谢!
您必须将词典设置为可选:
func updateUser(user: Dictionary<String, FBGraphUser>?, slot: Int) {...}
经过广泛的研究,我终于找到了一个方法:
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()
}
我偶然发现了这段 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];
}
它来自 Facebook iOS SDK 示例之一。我正在尝试在我的 Swift 编写的应用程序中使用它。这是我想出的:
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()
}
问题出在 Dictionary<String, FBGraphUser>
中,我认为这与 Obj-C 等效项不同。在检查 user
是否为 nil 的 if 语句中,Xcode 抛出错误:'Dictionary' is not convertible to 'String'.
那么如何将 Obj-C 代码转换为 Swift?
谢谢!
您必须将词典设置为可选:
func updateUser(user: Dictionary<String, FBGraphUser>?, slot: Int) {...}
经过广泛的研究,我终于找到了一个方法:
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()
}