Swift 4.1 - 无法将 [Character] 类型的值转换为 [String]

Posted

技术标签:

【中文标题】Swift 4.1 - 无法将 [Character] 类型的值转换为 [String]【英文标题】:Swift 4.1 - Cannot convert value of type [Character] to [String] 【发布时间】:2018-06-08 06:07:38 【问题描述】:

我的代码之前支持 Swift 3.3,现在我使用 Xcode 9.3 将其升级到 Swift 4.1。它在尝试构建我的项目时向我显示以下错误。

这是 JSON 解析的代码

    // MARK: Store JSON initializer

      convenience init?(withJSON json: JSON) 
        //json mapping 
        //This is of type [Character] after mapping
        let services = json["services"].arrayValue.flatMap( $0 ).flatMap( $0.1.stringValue ) //Convert response to 1D array and convert it to array if String

    

这是我试图调用的初始化方法

//Custom init method

  init(id: Int, storeNumber: String, title: String, location: Location, type: String, zip: String, parent: Int, city: String, services: [String], state: String, storePhone: [String], pharmacyPhone: [String], pharmacyFax: [String], workingHours: WorkingHoursString) 

    //field with error
    //here self.services is of type [String]
    self.services = services
  

我正在使用 pod 'SwiftyJSON', '3.1.4' 用于 Json 解析。

错误 - 无法将“[字符]”类型的值转换为预期参数 输入“[字符串]”

/* JSON for services is as given

    "services":[
     [
     "Fresh Food"
     ]
    ]

*/
    print("Services are \(services)")
    Services are ["F", "r", "e", "s", "h", " ", "F", "o", "o", "d"]

解决此问题的最简单解决方案是什么?

【问题讨论】:

你的 JSON 是什么样的? 我必须先构建我的代码,才能看到 JSON,因为此代码是维护性的,我们刚刚开始着手处理。但如果我得到它,我肯定会发布 JSON 对象。 您在黄色区域中的错误显示的内容与编译器抛出的错误不同??错误 - 无法将类型“[String]”的值转换为预期的参数类型“[character]”......并且无法将类型“[Character]”的值转换为预期的参数类型“[String]” 简单的解决方案是:[String(services)]。但是,如果您知道 JSON 的正确结构,您就不会陷入这种情况。 请显示您有问题的 json 原始输出。 【参考方案1】:

在以下代码中可以观察到相同的行为:

let services: [[String: Any]?] = [
    ["service1": "service1-name"],
    ["service2": "service2-name"]
]

let result = services
    .flatMap( $0 )
    .flatMap( $0.1 as! String )
print(result)

我认为这是由于 Swift 4 中 StringDictionary 的多重变化造成的(例如,String 变成了 Collection 字符)。在上面的代码中,第一个flatMap 将字典合并(展平)到一个字典中,第二个flatMap 将每个值作为String 并将它们展平为Character 的二维Collection

我想你想要这样的东西:

let result = services
    .compactMap  $0  // remove nil dictionaries
    .flatMap  // take all dictionary values as strings and flatten them to an array
       $0.values.map  $0.stringValue 
    
print(result)

这一行给出了一个字符串数组,预期的结果

let services = json["services"]
    .arrayValue
    .flatMap  $0.arrayValue 
    .map  $0.stringValue 

【讨论】:

我一定会发布 JSON 对象,一旦我得到它 ***.com/questions/27102666/… 这个链接也被用来解决这个问题。

以上是关于Swift 4.1 - 无法将 [Character] 类型的值转换为 [String]的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT 4.1 无法使用类型为“(字符串?)”的参数列表调用类型“Double”的初始化程序

无法使用 Swift 在 Xcode 中使用 Parse 1.7.2 和 Facebook SDK 4.1 创建新用户

是否可以将Swift 4.1添加到Xcode 10中

iOS 10,swift 4.1,将视图的顶部锚点设置为 topLayoutGuide 底部锚点导致冲突

swift Swift 4.1枚举示例

swift UIView的渐变视图 - Swift 4.1