преобразовать значение типа 'Result?'набрать 'String' - PullRequest
0 голосов
/ 22 сентября 2018

У меня проблемы с приведением моего массива типа 'result' к массиву строк.Это то, что я уже пробовал:

РЕДАКТИРОВАТЬ: мне нужна информация в виде типа строки, так как я хочу использовать 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 голосов
/ 22 сентября 2018

Я думаю, что нет такой вещи как [Array], я думаю, вы говорите о Array<Result>.Массив объекта Result.Что аналогично [Result].

Если по какой-то причине вы хотите создать из вас новый Array объект ArraySlice, просто вызовите инициализатор.

let resultsArray = Array(latestImageURls ?? [])

ОБНОВЛЕНИЕ

Вы говорите, что вам также необходимо преобразовать ваши Result объекты в String, но вы не объясните, что такое Result объект и как он это делает, какэто связано с String. содержит или 1022 * является строкой?Итак, я попытаюсь предположить.

Если вы хотите cast ваши объекты в String, вы можете сделать это так

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

Если вы хотите extractваши строки из результатов, если они есть (скажем, он хранится в параметре imageURL), вы можете сделать это следующим образом:

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

После этого latestImageURlsArray будет [String].

Если отношение совершенно другое и более сложное, добавьте более подробную информацию о классе Result, чтобы я мог сделать свой ответ более конкретным.

0 голосов
/ 22 сентября 2018

Как правило, способ преобразования ArraySlice данного типа в Array этого типа заключается в использовании инициализатора массива:

struct Thing {
}

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

В вашем случае массив фактически являетсяНеобязательный массив, поэтому вам нужно предпринять некоторые дополнительные шаги, чтобы разобраться с дополнительностью, как описано Юрием в его ответе:

let things: [Thing]? = []
let sliceOfArrayOfThings = things?.prefix(2)
let arrayOfThings = Array(sliceOfArrayOfThings ?? [])
0 голосов
/ 22 сентября 2018
  1. Вы не делаете "кастинг", вы просто говорите: "Я ожидал [Array]".Вы не делаете ничего, чтобы это было так.В любом случае это даже недопустимо, потому что Array не является допустимым типом.
  2. Как видите, prefix возвращает ArraySlice<T>, что обеспечивает облегченное представление в памяти Array<T>, без копирования каких-либо элементов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...