2015-03-09 3 views
0

Я наткнулся на этот кусок кода Objective-C:NSDictionary FBGraphUser Swift перевод

- (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]; 
} 

Это от одного из примеров SDK Facebook IOS. Я пытаюсь использовать его в своем письменном приложении 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. В инструкции if, чтобы проверить, нет ли user, ничего не происходит, Xcode выдает ошибку: «Словарь» не конвертируется в «String».

Как я могу перевести код Obj-C в Swift?

Спасибо!

ответ

0

После некоторых обширных исследований, я, наконец, нашел способ:

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

} 
0

Вы должны установить вам словарь в качестве опции:

func updateUser(user: Dictionary<String, FBGraphUser>?, slot: Int) {...} 
+0

Спасибо за ваш ответ. Я пробовал это, но он дал мне следующую ошибку: «Словарь ?» не имеет члена с именем 'objectID' Также для user.name. Другими словами, он не видит пользователя в качестве пользователя графика? Спасибо за помощь. – Niels

+0

да, я думаю, вам нужно принудительно развернуть факультатив и проверить, было ли это успешным, если var unwrapped_user = пользователь как FBGraphUser {... вы делаете, но используете unwrapped_user} – LoVo

+0

Этот вопрос с опциями меня прослушивает. Я попробовал ваш совет: 'if var unwrappedUser = user как FBGraphUser { }', но он дает мне эту ошибку: 'Невозможно отказаться от словаря ? ' to non @ objc protocol type 'FBGraphUser'' – Niels

Смежные вопросы