【问题标题】:Swift Can't access Single object arraySwift 无法访问单个对象数组
【发布时间】:2018-02-07 04:28:06
【问题描述】:

我正在尝试从 json 文件访问数据。问题是其中一些值是 NSSingleObjectArrays(仅包含项目的数组),我无法将其转换为字符串。

class CarObject {
    var pictureURL: String!
    var carURL: String!
    var carPrice: String!
    required init(json: [String: AnyObject]) {
        pictureURL = json["galleryURL"] as! String
        carURL = json["viewItemURL"] as! String
        carPrice = json["currentPrice"] as! String
        }
}

我收到以下错误消息:

无法将“__NSSingleObjectArrayI”(0x10a2ec548) 类型的值转换为“NSString”(0x109729440)。

我尝试这样访问它们:

"json["galleryURL"][0] as String!" 

但我收到以下错误:

Type 'Any?' has no subscript members

值如下所示:

galleryURL = ("一个值");

你们知道如何轻松访问它们吗? 谢谢!

【问题讨论】:

  • 如何将数组“转”为字符串?这个概念甚至意味着什么?这不是把大象变成马吗?确切地说,你想做什么?
  • 它是数组。像访问任何数组一样从数组中访问对象。
  • "键入“任何?”没有下标成员”将是一个很好的搜索短语。你知道,以防万一其他人以前曾经遇到过这个问题。如果json["galleryURL"] 是字符串数组,则需要将其强制转换为字符串数组,以便编译器知道这一点。

标签: arrays json swift xcode


【解决方案1】:

首先将事物转换为适当的类型。听起来您的值是包含单个字符串的数组,所以是这样的:

var pictureURL: URL

required init?(json: [String: AnyObject]) {
    guard let pictureURLString = (json["galleryURL"] as? [String])?.first,
        let pictureURL = URLComponents(string: pictureURLString)?.url else {
        return nil
    }

    self.pictureURL = pictureURL
}

此外,您可能需要重新考虑用于属性的类型。 pictureURL 和 carURL 属性是 URL,因此将它们键入为 URL 更有意义。 carPrice 属性可能是数字,所以它作为Double 更有意义。

【讨论】:

  • URLComponents 的意义何在? 1. OP 只想要一个字符串,而不是 URL。 2. 如果 OP 确实想要一个 URL,那么为什么不直接使用 URL(string:) 而不是 URLComponents?
  • URLComponents 是目前从字符串创建 URL 的推荐方法,因为它的行为比 URL(string:) 更现代。来自文档:“此结构根据 RFC 3986 解析和构造 URL。它的行为与符合旧 RFC 的 URL 结构的行为略有不同。”
  • 您阅读问题的代码了吗?你看到我的第一条笔记了吗?不需要URL。
  • 该值显然意味着包含一个 URL,因此对于该属性来说,URL 比 String 更合适。为工作使用正确的工具。我还建议 carPrice 属性应该是 Double 而不是 String。
  • 解决您的下一个反对意见:删除所有不必要的隐式解包和强制解包选项也是有意的,因为将这些选项最小化是一种好习惯。
猜你喜欢
  • 2018-01-03
  • 2019-06-13
  • 2020-12-08
  • 2017-08-13
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多