【问题标题】:Declaring NSDictionary and put it key value pair in Swift?声明 NSDictionary 并将其放入 Swift 中的键值对?
【发布时间】:2014-09-24 18:02:25
【问题描述】:

我一直在尝试使用类类型键和值声明一个 NSDictionary,如下所示:

var catAndSubCatDict: NSDictionary<Category, Array<SubCategory>> = NSDictionary<Category, Array<SubCategory>>()

这里,“Category”和“SubCategory”是全局类。我知道我不能对关键字段使用类类型。但是,无论如何我都应该做到这一点。有没有办法做到这一点?我如何声明专门的 NSDictionary 或类似的东西来做到这一点?

另外,我是这样使用这本词典的:

for(var i=0; i<resultJson.count; i++)
{
   let subCategoryItemList = resultJson.objectAtIndex(i) as NSDictionary
   let categoryItem = subCategoryItemList.valueForKey(WSConstants.CATEGORY_OBJ) as NSDictionary

   var category: Category = Category()
   category.categoryId    = categoryItem.valueForKey(WSConstants.CATEGORY_ID) as Int
   category.categoryName  = categoryItem.valueForKey(WSConstants.NAME) as String

   var subCategoryList: Array<SubCategory> = []
   let jsonSubCategoryList = subCategoryItemList.allKeysForObject(WSConstants.SUBCATEGORY_LIST_OBJ) as NSArray

   for(var i=0; i<jsonSubCategoryList.count; i++)
   {
      let subCategoryObj = jsonSubCategoryList.objectAtIndex(i) as NSDictionary

      var subCategory: SubCategory = SubCategory()
      subCategory.subCategoryId    = subCategoryObj.valueForKey(WSConstants.SUBCATEGORY_ID) as Int
      subCategory.subCategoryName  = subCategoryObj.valueForKey(WSConstants.NAME) as String
      subCategory.subCategoryType  = subCategoryObj.valueForKey(WSConstants.SUBCATEGORY_TYPE) as Int

      subCategoryList.append(subCategory)
   }
   self.catAndSubCatDict.setValue(category, forkey: subCategoryList) // Also, I have to achieve this
}

感谢您的回答,

最好的问候

【问题讨论】:

    标签: ios iphone swift


    【解决方案1】:

    NSDictionary支持泛型,所以你不能这样声明 - 如果你想使用它,实例化它如下:

    var catAndSubCatDict: NSDictionary = NSDictionary()
    

    Swift 提供了一种新的字典类型,它确实支持泛型,要创建它,您只需在代码中将 NSDictionary 替换为 Dictionary

    var catAndSubCatDict: Dictionary<Category, Array<SubCategory>> = Dictionary<Category, Array<SubCategory>>()
    

    或使用以下紧凑形式之一:

    var catAndSubCatDict: [Category : Array<SubCategory>] = [Category : Array<SubCategory>]()
    
    var catAndSubCatDict: [Category : [SubCategory]] = [Category : [SubCategory]]()
    

    请注意,在上述所有情况下,您都可以使用类型推断并通过删除变量类型来缩短代码:

    var catAndSubCatDict = NSDictionary()
    var catAndSubCatDict = Dictionary<Category, Array<SubCategory>>()
    var catAndSubCatDict = [Category : Array<SubCategory>]()
    var catAndSubCatDict = [Category : [SubCategory]]()
    

    最后,使用 swift 字典,您可以使用类作为键 - 您需要做的是使键类(代码中的 Category)实现 HashableEquatable协议

    【讨论】:

    • 更紧凑:[Category: [SubCategory]].
    • @robmayoff 谢谢,有时我忘了我应该递归应用优化:)
    • 如果您使用NSDictionary,请使用dict.setValue(value: value, forKey: key),对于快速字典,只需使用dict[key] = value
    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多