Я наткнулся на этот кусок кода 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?
Спасибо!
Спасибо за ваш ответ. Я пробовал это, но он дал мне следующую ошибку: «Словарь?» не имеет члена с именем 'objectID' Также для user.name. Другими словами, он не видит пользователя в качестве пользователя графика? Спасибо за помощь. –
Niels
да, я думаю, вам нужно принудительно развернуть факультатив и проверить, было ли это успешным, если var unwrapped_user = пользователь как FBGraphUser {... вы делаете, но используете unwrapped_user} – LoVo
Этот вопрос с опциями меня прослушивает. Я попробовал ваш совет: 'if var unwrappedUser = user как FBGraphUser { }', но он дает мне эту ошибку: 'Невозможно отказаться от словаря? ' to non @ objc protocol type 'FBGraphUser'' –
Niels