从Swift2中复杂的Dictionary字典中获取值

时间:2015-10-22 09:08:02

标签: arrays swift dictionary swift2

我将字典显示为UITableView。我在Objective-c中很容易做到这一点。但现在很快,我无法从字典数组中获取值。当我尝试在tableView:cellForRowAtIndexPath预编译器中获取值时抛出错误

  

无法转换类型" AnyObject的值?!"指定类型'数组'

或类似下面的例子

  

无法转换类型" AnyObject的值?!"使用类型' int'

的idnex
var cellArray = []

override func viewDidLoad() {
    cellArray = [
        [
            "section" : "Melody",
            "rows" :
                [
                    [
                        "title" : "Wi-Fi / Pairing",
                        "icon" : "",
                        "action" : "actionConnectSpeaker"
                    ],
                    [
                        "title" : "Sound",
                        "icon" : "",
                        "action" : "actionConnectSpeaker"
                    ]
                ]
        ],

        [
            "section" : "Music",
            "rows" :
                [
                    [
                        "title" : "Add a new account",
                        "icon" : "",
                        "action" : "actionAddAccount"
                    ]
                ]
        ]
    ]
}

...

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: UITableViewCellStyle.Value2, reuseIdentifier: nil)

    cell.textLabel?.text = cellArray[indexPath.section]["rows"][indexPath.row]["title"]


    return cell
}

我总结说我们不能这样做......我找到了任何一个例子。我可能不太了解Swift中的类型......

4 个答案:

答案 0 :(得分:2)

在Swift中,如果要调用AnyObjectobjectAtIndex:这样的函数,你必须调用objectForKey:类型的内容。

let section = cellArray[indexPath.section]
let rows = section["rows"] as! [[String:String]]
cell.textLabel?.text = rows[indexPath.row]["title"]

答案 1 :(得分:0)

如果您确定没有nil值,只需执行此操作:

cell.textLabel?.text = cellArray[indexPath.section]["rows"]![indexPath.row]["title"]

答案 2 :(得分:0)

如果你想安全地做(如果任何对象可以是零或其他类型,你应该使用if let

if let dict = cellArray[indexPath.section] as? [String : AnyObject],
    rows = dict["rows"] as? [AnyObject], 
    result = rows[indexPath.row] as? [String : AnyObject],
    title = result["title"] {
    cell.textLabel?.text = title
}

答案 3 :(得分:0)

您通常应该避免在Swift中使用不同类型的元素的集合。您的部分数据是字典,"部分"的值key是一个字符串,而" rows"的值是key是一个数组。尝试用元组替换这个字典。

   function _GetHospitalData(){

    $data = $this->input->post('search');
    $column = $this->input->post('column');

    //var_dump($this->input->post());die();


    $this->db->select('name,code');
    $this->db->from('facility_info');
    $this->db->like("LOWER($column)", strtolower($data));
    $query = $this->db->get();

    $hospital_array = array();
    foreach ($query->result() as $row) {
        $hospital_array[] = $row->$column;
    }
    //return $hospital_array;
    return  $query->result_array();
}

通过这种方式,Swift的类型系统可以帮助您确保使用正确的类型,不需要强制向下转换。