简体   繁体   English

NSDictionary FBGraphUser Swift翻译

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM