Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 3 JSON多维NSArray到字符串_Swift - Fatal编程技术网

Swift 3 JSON多维NSArray到字符串

Swift 3 JSON多维NSArray到字符串,swift,Swift,我从JSON接收多维数组,并尝试将其存储到NSArray对象中。然后我想通过picker迭代该对象。这在Swift 2上起作用,但一旦我转换为Swift 3,我在pickerView函数中得到“Type Any has no subscript members”错误 相关代码(名称和面已更改): 这些行显示错误: 让票号=pvds票号[行][“票号”]为!字符串 让客户名称=pvds票号[行][“客户名称”]为!字符串pvds\u票证号看起来被指定为NSArray。当您访问它时,您将其视为NSA

我从JSON接收多维数组,并尝试将其存储到NSArray对象中。然后我想通过picker迭代该对象。这在Swift 2上起作用,但一旦我转换为Swift 3,我在pickerView函数中得到“Type Any has no subscript members”错误

相关代码(名称和面已更改):

这些行显示错误:
让票号=pvds票号[行][“票号”]为!字符串

让客户名称=pvds票号[行][“客户名称”]为!字符串

pvds\u票证号
看起来被指定为
NSArray
。当您访问它时,您将其视为
NSArray

给出问题的第一行是:
let ticket\u number=pvds\u ticket\u number[row][“ticket\u number”]as!字符串
。编译器知道
pvds\u ticket\u number
是一个数组,因此使用
[row]
就可以了。但是,编译器不知道索引
中是什么类型或对象,因此它认为它是类型
Any
。正如编译器正确地告诉您的那样,
Any
类型没有下标方法

处理此问题的最简单方法是向编译器提供有关
pvds\u票证号的更多信息。当前分配时,您使用:

self.pvds\u票证号=结果为![任何]作为NSArray

首先,除非您特别需要从<代码> NSArray < /COD> > <代码>数组< /代码>不必考虑使用<代码>数组< /代码>。在这种情况下,上述行将变得更像:

self.pvds\u票证号=结果为![[String:String]]


这假设您的数组是一个字典数组,其中包含键和值的字符串,您可能需要根据字典的实际组成更改该位。

如果我是您,我会使用swiftyjson cocoa pod。我曾经为类似的问题而挣扎,似乎无论我学到多少,它们总是会出现。Swiftyjson轻巧且易于使用,因此您不必坐着几个小时试图找出一个愚蠢的简单解决方案来积累技术债务。

您检查过这些吗?使用“Any has no subscript members”搜索没有任何帮助?我更正了我的代码,使用[String:String]。然而,我现在在我得到上一个错误的那些行上得到了“模糊引用以记住下标”。在某个地方,您将
pvds\u ticket\u number
声明为变量。我猜它的定义是
NSArray
,而不是
[String:String]
。如果有疑问,请将该行拆分为多行,以便更好地了解问题的实际位置。它被声明为var pvds_ticket_number=[String:String]()刚刚看到最后一行代码中有一个错误。它应该是
[[String:String]]
,而不是
[String:String]
。第一个是字典数组,第二个是单个字典。谢谢,我会查出来的。对于像我这样的人来说,因为我试图为工作制作一个简单的应用程序而只涉猎它是很困难的。
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    let ticket_number =  pvds_ticket_number[row]["ticket_number"] as! String
    let customer_name = pvds_ticket_number[row]["customer_name"] as! String
    return "\(ticket_number) - \(customer_name)"
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
    let ticket_number = pvds_ticket_number[row]["ticket_number"] as! String
    txt_ticket_number.text = ticket_number
}

func get_tickets ()
{
    let userID = UserDefaults.standard.string(forKey: "userID")
    let url_path: NSString = "my_url_that_isnt_relevant" as NSString;
    let url_path_formatted: NSString = url_path.addingPercentEscapes(using: String.Encoding.utf8.rawValue)! as NSString

    let url = URL(string: url_path_formatted as String)
    let session = URLSession.shared

    let task = session.dataTask(with: url!, completionHandler: {data, response, error -> Void in

        if(error != nil) {
            // If there is an error in the web request, print it to the console
            print(error!.localizedDescription)
        }


        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

            if let parseJSON = json {
                if let results: NSArray = parseJSON["results"] as? NSArray{
                    DispatchQueue.main.async(execute: {
                        self.pvds_ticket_number = results as! [Any] as NSArray
                        self.pv_ticket_number.reloadAllComponents()
                    })
                }
        }

        } catch {
            print("something went wrong")
        }

    })

    task.resume()

}