【问题标题】:error using valueForKey in swift在 swift 中使用 valueForKey 时出错
【发布时间】:2025-12-10 12:40:01
【问题描述】:

为什么我在使用valueForKey 时会出错...我使用与objectiveC 相同的技巧...

ObjectiveC,代码是

self.strSubscribe =[responseObject[@"subscribe"] valueForKey:@"subscribe_ids"]; 

Swift,代码是

self.strSubscribe = responseObject["subscribe"].valueForKey["subscribe_ids"] as! String  

我声明变量像

var arraySubCategory : NSMutableArray! = NSMutableArray()
var strSubscribe:String!  

我试图从下面的响应中访问值

 { 
     subscribe = 
            {
               "subscribe_ids" = "1,14";
            }

 }

编辑 它使用 Amit 和 Eric 的解决方案,但现在用于跟踪数据

 { 
     data =     (
            {
        "subscribe_ids" = "1,14";
    }
    );
 }  

  let dictionary = responseObject["data"][0] as! Dictionary<String,AnyObject>
  self.strSubscribe = dictionary["subscribe_ids"] as! String  

或//

 if let dic = responseObject["data"][0] as? [String:String], let ids = dic["subscribe_ids"] {
self.strSubscribe = ids  
}

但它给了我错误:

找不到成员“下标”

【问题讨论】:

  • 我不知道为什么会这样,但我发现了一个标题类似于你问题的问题。看看*.com/questions/26508044/…
  • 似乎您必须将responseObject["subscribe"] 转换为正确的类型,然后才能访问其.valueForKey
  • subscribe 似乎不是字符串(如您的回复中所示)。尝试将其转换为 [String:String] 并在此转换中运行 .valueForKey
  • @gutenmorgenuhu 是有效的

标签: ios swift


【解决方案1】:

Swift 不知道responseObject["subscribe"] 的类型,你得帮编译一下;例如:

if let dic = responseObject["subscribe"] as? [String:String], let ids = dic["subscribe_ids"] {
    self.strSubscribe = ids  // "1,14"
}

更新:

还是同样的问题:编译器不知道responseObject["data"]的类型,所以当你尝试访问下标时会出错(因为知道它是数组中的字典,但编译器没有)。

一种解决方案是通过在if let 条件中声明一个字典数组来将类型提供给编译器:

if let arr = responseObject["data"] as? [[String:String]], let ids = arr[0]["subscribe_ids"] {
    self.strSubscribe = ids  
}

注意它是[[String:String]](字典数组),而不是[String:String](字典)。

【讨论】:

    【解决方案2】:

    这样写。

    let dictionary = responseObject["subscribe"] as! Dictionary<String, AnyObject>
    self.strSubscribe = dictionary["subscribe_ids"] as! String
    

    既然responseObject["subscribe"] 会给出一个AnyObject?输出并且 AnyObject 没有任何名为 valueForKey 的成员。

    【讨论】:

    • valueForKey 方法不在 Swift 字典中。您不能使用此方法。