我正在处理一个我真的不想处理但认为do, catch
可能能够处理的选项。
do { run(playSound["correct"]!) } catch {print("Failed to find")}
对于那些不熟悉 SpriteKit 的人, playsound("correct") 是一个播放声音的动作:
我用函数创建了很多它们,并将它们放入字典中,其中使用字符串键来查找正确的键。
func makePlayable(_ soundFileName: String) -> SKAction {
let playSoundAction = SKAction.playSoundFileNamed(soundFileName, waitForCompletion: false)
return playSoundAction
}
...想象一下,for
这里有一个循环将其中的一百个左右放入字典中,其中一个字符串取自音频的文件名,作为播放适当声音的动作的关键。
我要处理的问题是使用字典来返回和播放动作意味着可选的又回来了。
需要解包:
run(playSound["correct"]!)
也许我的担心是没有根据的,但这立即让我觉得我必须以某种方式更优雅地执行此操作,以便我可以处理试图确定要播放的声音文件的动作字符串的系统中的潜在故障......是的,对不起那句话。
我的第一个选择是这样的:
if let soundAction = playSound["correct"]{
run(soundAction)
}
else{ print("Can't find playable sound Action with this name in \(playSound) dictionary")
}
这让我觉得没有必要而且啰嗦,所以我看着do
但是,当以问题顶部描述的方式使用时,会导致警告,表明 catch 永远不会被调用。
我做错了什么,或者我是否错误地认为do, catch
甚至适合这个?