【问题标题】:Downcast from 'String?' to 'String' only unwraps optionals从'字符串'垂头丧气?到 'String' 只解开可选项
【发布时间】:2016-08-18 18:38:59
【问题描述】:

我正在尝试从DocumentDirectory 读取.mid 文件。我试过这个:

var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
var midiFileURL = NSURL.fileURLWithPath(path)

问题是:

来自“字符串?”的向下转换to 'String' 只解开选项;您的意思是使用“!”吗?

一旦我从DocumentsDirectory 读取文件,我希望能够用这个播放它:

guard let bankURL = NSBundle.mainBundle().URLForResource("gs_instruments", withExtension: "dls") else {
    fatalError("\"gs_instruments.dls\" file not found.")
}

do {
    try self.midiPlayer = AVMIDIPlayer(contentsOfURL: midiFileURL, soundBankURL: bankURL)
    print("created midi player with sound bank url \(bankURL)")
} catch let error as NSError {
    print("Error \(error.localizedDescription)")
}

self.midiPlayer.prepareToPlay()

self.midiPlayer.play({
    print("midi done")
}) 

我该如何解决这个错误?非常感谢。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first 正在向您返回一个Optional<String>(又名String?)。您正在尝试将其转换为 String。警告告诉您您正在以一种麻烦的方式执行此操作。你可以用!强制解包:

    var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
    

    当然,因为您是强制展开,所以如果返回的值为 nil(如果集合为空时没有 first...),您的应用程序将面临崩溃的风险。

    我强烈建议您阅读 Swift Language Guide - The Basics 中的 Optionals。

    【讨论】:

    • 非常感谢。
    • 请花时间阅读语言指南。它在解释事物方面做得非常出色,尤其是作为可选语言的核心功能。
    • 我认为如果你使用 [0] 而不是 .first 你不会得到一个可选的。
    • @PhoneyDeveloper 即使它更长,我还是更喜欢.first!。它使危险更加明确,并且与我使用 .last! 而不是 arr[arr.count-1] 的方式更加一致
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2018-10-31
    • 2019-02-13
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多