2015-08-01 2 views
2

Я видел это в других вопросах, но я думаю, что, поскольку этот NSDictionary доступен через индекс, он бросает некоторые ошибки.Кастинг NSDictionary как словарь Swift

func pickRandomRecipe(arrayOfRecipes: NSArray) -> Dictionary<String,Any> { 
let randomRecipeIndex = Int(arc4random_uniform(UInt32(arrayOfRecipes.count))) 

//Could not cast value of type '__NSDictionaryI' (0x7fbfc4ce0208) to 'Swift.Dictionary<Swift.String, protocol<>>' (0x7fbfc4e44358) 
let randomRecipe: Dictionary = arrayOfRecipes[randomRecipeIndex] as! Dictionary<String,Any> 
return randomRecipe 
} 

ответ

4

В этом случае NSDictionary может быть отлиты только [String: NSObject]. Если вы хотите, чтобы это было типа [String : Any], вам нужно сделать отдельный словарь:

var dict = [String : Any]() 
for (key, value) in randomRecipe { 
    dict[key] = value 
} 
4

NSDictionary должны быть мостиком [NSCopying: AnyObject] или в случае [String: AnyObject], а не с помощью Any (так как это Свифта-только построить).

Но я бы порекомендовал не используя NSDictionary вообще. Вы можете определить свою функцию

typealias Recipe = [String: AnyObject] // or some other Recipe class 

func pickRandomRecipe(recipes: [Recipe]) -> Recipe? { 
    if recipes.isEmpty { return nil } 
    let index = Int(arc4random_uniform(UInt32(recipes.count))) 
    return recipes[index] 
} 

или, возможно, даже лучше:

extension Array { 
    func randomChoice() -> Element? { 
     if isEmpty { return nil } 
     return self[Int(arc4random_uniform(UInt32(count)))] 
    } 
} 

if let recipe = recipes.randomChoice() { 
    // ... 
} 
Смежные вопросы