#swift #foreach #base64 #decode #ambiguous
#swift #foreach #base64 #декодировать #неоднозначный
Вопрос:
У меня вопрос:
Я извлекаю длинную строку, состоящую из некоторых базовых 64 строк, присоединенных вместе с «;», разделяющих каждую из них внутри указанной строки.
Вот мой код:
if(item.photo != "null"){
let b64fullstring = item.photo
if(b64fullstring!.contains(";")){
let photos = b64fullstring!.split(separator: ";")
for pic in photos{
let base64encodedstring = pic
let decodedData = Data(base64Encoded: base64encodedstring!, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)!
let decodedString = String(data: decodedData, encoding: .utf8)!
print(pic)
}
}
}
Это дает мне следующую ошибку в функции «данные»;
Тип выражения неоднозначен без дополнительного контекста
Я действительно не понимаю.
При работе с одной строкой он работает отлично. Но при использовании цикла по какой-то причине он выдает это сообщение.
Спасибо, что уделили мне немного своего времени, чтобы помочь мне.
Ответ №1:
Ошибки Swift не очень полезны. Проблема в том, что метод split возвращает массив подстрок:
func split(separator: Character, maxSplits: Int = Int.max, omittingEmptySubsequences: Bool = true) -> [Substring]
И инициализатор данных ожидает строку:
init?(base64Encoded base64String: String, options: Data.Base64DecodingOptions = [])
Вам просто нужно инициализировать новую строку из вашей подстроки:
if let photos = b64fullstring?.split(separator: ";") {
for pic in photos {
if let decodedData = Data(base64Encoded: String(pic), options: .ignoreUnknownCharacters) {
if let decodedString = String(data: decodedData, encoding: .utf8) {
print(pic)
}
}
}
}
Другой вариант — использовать components(separatedBy:)
метод, который возвращает массив строк вместо подстрок:
func components<T>(separatedBy separator: T) -> [String] where T : StringProtocol
if let photos = b64fullstring?.components(separatedBy: ";") {
for pic in photos {
if let decodedData = Data(base64Encoded: pic, options: .ignoreUnknownCharacters) {
if let decodedString = String(data: decodedData, encoding: .utf8) {
print(pic)
}
}
}
}
Комментарии:
1. Это было так просто. Большое спасибо за ваш подробный ответ. Я действительно не привык к string, и мне показалось странным, что простой метод разделения возвращает что-то еще, кроме строк, особенно если есть функции, которые не работают с substring . Сообщение об ошибке могло быть более конкретным. Еще раз спасибо, что уделили время ответу, будьте осторожны 🙂