【问题标题】:JSONSerialization works with iOS simulator but has error 'Ambiguous use of 'subscript' when using phoneJSONSerialization 适用于 iOS 模拟器,但在使用电话时出现错误“不明确地使用 '下标'
【发布时间】:2017-01-30 14:14:26
【问题描述】:

以下脚本在手机上的两个模拟器上使用 Swift 2 运行良好。更新到 swift 3 后,该脚本在模拟器上运行良好,但在为手机构建时会引发错误 - 以下行中下标的模糊使用 -

let aObject = linkJSON[index] as! [String : AnyObject]

我已尝试将行更改为使用 Any,但是错误没有更改。

因此完整的代码是-

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var orgs: [String] = []
    var icon: [String] = []
    var address1: [String] = []
    var address2: [String] = []
    var address3: [String] = []
    var address4: [String] = []
    var postcodes: [String] = []
    var phone: [String] = []
    var email: [String] = []
    var website: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        let url=URL(string:"http://webdata.net/service.php")
        do {
            let allLinksData = try Data(contentsOf: url!)
            let allLinks = try JSONSerialization.jsonObject(with: allLinksData, options:.allowFragments) as! [String : AnyObject]
            if let linkJSON = allLinks["organisations"] {
                for index in 0...linkJSON.count-1 {

                    let aObject = linkJSON[index] as! [String : AnyObject]

                    orgs.append(aObject["org"] as! String)
                    icon.append(aObject["icon"] as! String)
                    address1.append(aObject["address1"] as! String)
                    address2.append(aObject["address2"] as! String)
                    address3.append(aObject["address3"] as! String)
                    address4.append(aObject["address4"] as! String)
                    postcodes.append(aObject["postcode"] as! String)
                    phone.append(aObject["phone"] as! String)
                    email.append(aObject["email"] as! String)
                    website.append(aObject["website"] as! String)
                }
            }
            print(orgs)

            self.tableView.reloadData()
        }
        catch {

        }

    }

可能是因为是星期一,但我这里有一个空白。

谢谢

弓帽

【问题讨论】:

  • 您可以将[String : AnyObject] 替换为NSDictionary
  • 在 Swift 3 中,正确的 JSON 格式是 [String:Any],另外你需要简单地将 linkJSON 的类型指定为字典数组 if let linkJSON = allLinks["organisations"] as? [[String:Any]] {
  • 这是真正的网址吗?我尝试构建您的代码,但收到错误 The data couldn’t be read because it isn’t in the correct format.
  • @PiyushRathi NSDictionary 让事情变得更糟。
  • Russell,它是一个被屏蔽的 URL,我在发帖前忘记清除屏蔽了。道歉。

标签: ios json swift3


【解决方案1】:

我建议你更换

if let linkJSON = allLinks["organisations"] {

if let linkJSON = allLinks["organisations"] as? [[String: AnyHashable]] {

那么你不需要强制解开linkJSON[index],你可以这样做

let aObject = linkObject[index]

【讨论】:

  • 马克,非常感谢。我刚刚添加为? NSArray 到同一行,并取得了效果。再次感谢您的及时协助。 :-)
  • as? NSArray 不要那样做。使用 Swift 数组和字典而不是 NSArray 和 NSDictionary。
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多