Swift 3只在设备上调试时模糊地使用下标

时间:2017-01-26 23:04:41

标签: ios swift swift3

所以我正在制作一个小应用来更新我托管的网站上的某些数据。我从未在swift 3中写过任何东西,所以这对我来说有点混乱。

现在我从网站上提取一个名单列表以便在选择器中使用,原因很明显我会编辑我使用的服务的网址,但所有代码都应该是可以理解的。< / p>

我有这个代码适用于我已设置为与我的手机(6s)相同型号的模拟器,它可以在模拟器中工作但是当我尝试在手机上测试它时出错模糊地使用下标(我将在代码中指明行)

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet weak var playerTextPicker: UITextField!

var pickOption = [String]()
let picker = UIPickerView()

override func viewDidLoad() {
    super.viewDidLoad()
    getPlayerJson()
    picker.delegate = self
    picker.dataSource = self

    playerTextPicker.inputView = picker
}

public func numberOfComponents(in pickerView: UIPickerView) -> Int{
    return 1
}

public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    return pickOption.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return pickOption[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    playerTextPicker.text = pickOption[row]
    self.view.endEditing(false)
}

func getPlayerJson(){
    let players = [String]()
    let url = URL(string: "http://www.test.com/test.php")

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in

        if error != nil{
            print("Error")
        }
        else{
            if let myData = data{
                do{
                    let jsonResult = try JSONSerialization.jsonObject(with: myData, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject

                    var jsonElement: NSDictionary = NSDictionary()

                    for i in 0 ..< jsonResult.count
                    {

                        jsonElement = jsonResult[i] as! NSDictionary //ERRORS HERE


                        //the following insures none of the JsonElement values are nil through optional binding
                        if
                            let name = jsonElement["name"] as? String
                        {
                            self.pickOption.append(name)
                        }


                    }

                }catch{
                    //print error
                }
            }
        }
    }
    task.resume()
}
}

2 个答案:

答案 0 :(得分:1)

我不知道模拟器如何允许你这样做,但是这一行:

let jsonResult = try JSONSerialization.jsonObject(with: myData, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject

JSON对象是数组或字典。 AnyObject含糊不清。如果您确定它是一个数组,请将其强制转换为[AnyObject]

let jsonResult = try JSONSerialization.jsonObject(with: myData, options: .mutableContainers) as! [AnyObject]

答案 1 :(得分:1)

当你使用Swift时,你应该尝试使用Swift代码。你的代码不是Swift,它的Objective-C试图假装它是Swift。

mutableContainers选项是无意义的,只会减慢你的代码速度(当你理解它的作用并且你需要它时使用它)。请改用[]。

由于您没有处理JSONSerialization引发的情况,只需使用try?

将JSONSerialization的结果转换为? [任何]。

循环遍历数组:for(数组中的项) 获取字典并检查它是否有效而不是崩溃:

if let dict = item as? [AnyHashable, Any] {
}