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()

}