Swift 4: тип выражения неоднозначен без дополнительного контекста внутри цикла

#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 . Сообщение об ошибке могло быть более конкретным. Еще раз спасибо, что уделили время ответу, будьте осторожны 🙂