Преобразовать ошибку swift 2.3 в swift 3

я конвертирую swift 2.3 в swift 3 в xcode 8.2

swift 2.3: Есть ли код, Есть ли код, Есть ли код, Есть ли код, Есть ли код

func playAudio() {
    self.stopAudio()
    let lessonObject:LessonObject = self.lessonArray[self.selectedIndex] as! LessonObject
    let fullPath:String! = Constants.URL_HOST + "\(lessonObject.lessonPath)"
    let soundURL:NSURL! = NSURL.init(string:fullPath)
    let documentsDirectoryURL =  NSFileManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
    let destinationUrl = documentsDirectoryURL.URLByAppendingPathComponent(soundURL.lastPathComponent!)
    if NSFileManager().fileExistsAtPath(destinationUrl!.path!) {
        if let soundData = NSData(contentsOfFile: destinationUrl!.path!) {
            self.initAudioWithData(soundData)
        }
        else {
            self.audioErrorAction()
        }
        return
    }
    
    if let soundData = NSData(contentsOfURL:NSURL(string:fullPath)!) {
        self.initAudioWithData(soundData)
    }
    else {
        self.audioErrorAction()
    }
}

swift 3: Есть ли ошибка в коде?

        func playAudio() {
        self.stopAudio()
        let lessonObject:LessonObject = self.lessonArray[self.selectedIndex] as! LessonObject
        let fullPath:String! = Constants.URL_HOST + "\(lessonObject.lessonPath)"
let soundURL:URL! = URL.init(fileURLWithPath: fullPath)
        let documentsDirectoryURL =  FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
let destinationUrl = documentsDirectoryURL.appendingPathComponent(soundURL.lastPathComponent)
        if FileManager().fileExists(atPath: destinationUrl.path){
            if let soundData = try? Data(contentsOf: URL(fileURLWithPath: destinationUrl.path))
            {
                self.initAudioWithData(soundData)
            }
            else {
                self.audioErrorAction()
            }
            return
        }
if let soundData = try? Data(contentsOf: URL(string:fullPath)!)
        {
            self.initAudioWithData(soundData)
        }
        else {
            self.audioErrorAction()
        }
    }

после преобразования моей ошибки:

найдено nil при развертывании необязательного значения.

Я строю swift 2.3: destinationUrl = file:///Users/admin/Library/.../Documents/test.mp3 0x00006080002a73e0

Я создаю swift 3: destinationUrl = file:///Users/admin/Library/.../Documents/Optional(%22test.mp3%22)


person TuanKenz    schedule 18.12.2016    source источник
comment
какая строка сообщает об ошибке?   -  person aircraft    schedule 18.12.2016
comment
если пусть soundData = try? Данные (contentsOf: URL (строка: полный путь)!)   -  person TuanKenz    schedule 18.12.2016
comment
Если у вас уже есть destinationUrl как URL, зачем вы создаете новый URL из его path? Просто сделайте if let soundData = try? Data(contentsOf: destinationUrl).   -  person rmaddy    schedule 18.12.2016
comment
Что за URL-адрес fullPath?   -  person vadian    schedule 18.12.2016
comment
@TuanKenz, явно fullPath недопустимая строка URL-адреса, можете ли вы вставить ее сюда? И в будущем старайтесь избегать использования !.   -  person user28434'mstep    schedule 19.12.2016
comment
Разве вы не должны использовать init(fileURLWithPath: String)? вместо init(string: String)?   -  person Sulthan    schedule 19.12.2016
comment
В любом случае, если файл не существует, почему вы пытаетесь загрузить данные?   -  person Sulthan    schedule 19.12.2016
comment
@TuanKenz, почему бы тогда не использовать soundURL вместо того, чтобы дважды преобразовывать путь в URL?   -  person user28434'mstep    schedule 19.12.2016


Ответы (1)


Источник ошибки находится в этой строке

let fullPath:String! = Constants.URL_HOST + "\(lessonObject.lessonPath)"

Прежде всего, хотя это и не связано с проблемой, не аннотируйте типы, которые может вывести компилятор. Вы превратили хорошую необязательную строку в хуже неявно развернутую необязательную.

Свойство lessonPath, по-видимому, также является необязательным (неявно развернутым). Используя интерполяцию строк, вы получаете буквально "Optional(foo)". Вам нужно развернуть необязательную или использовать необязательную привязку, если свойство может быть nil. Рассмотрите необязательное свойство, если значение никогда не может быть nil

let fullPath = Constants.URL_HOST + "\(lessonObject.lessonPath!)"

Для получения дополнительной информации прочитайте Неверная интерполяция строк Swift 3 с неявно развернутые опции

Никогда не объявляйте свойства как неявные развернутые необязательные параметры, чтобы избежать написания инициализатора.

person vadian    schedule 19.12.2016