转换类型为“结果?”的值键入“字符串”

时间:2018-09-21 22:26:02

标签: arrays swift casting

我在将“结果”类型的数组强制转换为字符串数组时遇到问题。这是我已经尝试过的:

编辑: 我需要使用String类型的信息,因为我想使用URL作为图像源。

swift4

let message = try? JSONDecoder().decode(Welcome.self, from: data)
let imageURLs = message?.children.attachment.results.filter({ $0.metadata.mediaType == "image/png" })
let latestImageURls = imageURLs?.prefix(2)
let latestImageURlsArray = Array(latestImageURls ?? [])

let image1 = self.view.viewWithTag(63) as! UIImageView
let image2 = self.view.viewWithTag(64) as! UIImageView
let image3 = self.view.viewWithTag(65) as! UIImageView

let url1 = URL(string: latestImageURlsArray[0]) // error:Cannot convert value of type 'Result' to expected argument type 'String
let url2 = URL(string: latestImageURlsArray[1]) // error:Cannot convert value of type 'Result' to expected argument type 'String
let url3 = URL(string: latestImageURlsArray[2]) // error:Cannot convert value of type 'Result' to expected argument type 'String

image1.kf.setImage(with: url1)
image2.kf.setImage(with: url2)
image3.kf.setImage(with: url3)

3 个答案:

答案 0 :(得分:1)

我认为没有[Array]这样的东西,我想您是在谈论Array<Result>Result对象的数组。与[Result]相同。

如果出于某种原因要从Array创建一个新的ArraySlice对象,只需调用一个初始化程序。

let resultsArray = Array(latestImageURls ?? [])

更新

您是说还需要将Result对象转换为String,但是您没有解释Result对象是什么以及它如何与对象相关到String。它是包含还是字符串?所以我会假设。

如果您想cast反对String,则可以这样做

let latestImageURlsArray = resultsArray.compactMap { $0 as? String }

如果您希望从结果中extract来获取字符串,(例如,它存储在imageURL参数中),您可以这样做

let latestImageURlsArray = resultsArray.compactMap { $0.imageURL }

之后,latestImageURlsArray将是[String]

如果关系完全不同并且更加复杂,请添加有关Result类的更多详细信息,以便我可以更具体地回答。

答案 1 :(得分:0)

  1. 您没有进行任何“广播”,只是在说“我期望[Array]”。您没有采取任何措施使情况成为现实。无论如何,这甚至是无效的,因为Array不是有效的类型。
  2. 如您所见,prefix返回一个ArraySlice<T>,它提供了对Array<T>内存的轻量级视图,而无需复制任何元素。

答案 2 :(得分:0)

通常,将给定类型的ArraySlice转换为该类型的Array的方式是使用数组初始化程序:

struct Thing {
}

let things = [Thing]()
let sliceOfArrayOfThings = things.prefix(2)
let arrayOfThings = Array(sliceOfArrayOfThings)

在您的情况下,您的Array实际上是一个Optional数组,因此您必须采取一些额外的步骤来处理可选性,如Yury在他的回答中所述:

let things: [Thing]? = []
let sliceOfArrayOfThings = things?.prefix(2)
let arrayOfThings = Array(sliceOfArrayOfThings ?? [])