类型“字符串”没有成员“播放”
Posted
技术标签:
【中文标题】类型“字符串”没有成员“播放”【英文标题】:Type 'string' has no member 'playback' 【发布时间】:2019-06-13 22:02:39 【问题描述】:尝试在 xcode 10.1 中构建木琴时,在 ios12 上使用 swift 4.2,我使用按钮播放 .wav 文件并输入以下代码,但出现以下错误:
"type 'String' 没有成员 'playback'"
func playSound()
guard let url = Bundle.main.url(forResource: "soundName", withExtension: "mp3") else return
do
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
try AVAudioSession.sharedInstance().setActive(true)
/* The following line is required for the player to work on iOS 11. Change the file type accordingly*/
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
/* iOS 10 and earlier require the following line:
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */
guard let player = player else return
player.play()
catch let error
print(error.localizedDescription)
【问题讨论】:
您确定您的项目是为 Swift 4.2 而不是早期版本设置的吗? 如果您使用的是 swift 4,请使用AVAudioSessionCategoryPlayback
而不是 .playback
作为类别。
您的代码需要一个 .mp3 文件,但声音文件真的是一个 .wav 文件吗?
我尝试使用 AVAudioSessionCategoryPlayback 而不是 .playback。还是不行。是的,我还检查了 swift 版本的 4.2。它有一个 .wav 扩展名,它必须是 .wav 文件,对吗?我很困惑。
【参考方案1】:
我在查看 *** 并借用了这段有效的代码,但我不知道它是否是传统的做法。
斯威夫特 4.2
import AVFoundation
var player = AVAudioPlayer()
let url = URL(fileURLWithPath: Bundle.main.path(forResource: "note1", ofType: "wav")!)
do
player = try AVAudioPlayer(contentsOf: url)
player.play()
catch
print("couldn't load file :(")
【讨论】:
【参考方案2】:func playSound()
let soundURL = Bundle.main.url(forResource: selectedSoundFileName, withExtension: "wav")
do
audioPlayer = try AVAudioPlayer(contentsOf: soundURL!)
audioPlayer.play()
catch
这是您可以尝试的另一种变体!让我知道这种格式是否适合您。很久以前,我在 Udemy 课程中自己构建了一个木琴应用程序。在我看来,将声音文件直接放入您的项目并在那里运行它们比从任何地方拉取它们要容易得多。
这是我可以为您实现的最“迅速”的方式。
【讨论】:
是的,我现在正在做同样的 udemy 课程:P。您还需要创建 var audioPlayer 并导入 AVfoundation。除此之外,你的答案和我的一样:) 是的,我在你发帖的同时发布了我的,哈哈,对不起!【参考方案3】:如果您单击AVAudioSession
上的跳转到定义,Xcode 将打开该类的原始源文件,您可以从那里查看该类中每个方法的结构。这有助于查看每个函数的结构和确定每个函数的数据参数。此外,在与不同 iOS 部署目标兼容的类函数的每个变体上方都有注释,由 @available(iOS 11.0, *)
注释指示。我们在这个类中关注open func setCategory
函数。
原始源文件中的有用信息
Allowed categories: AVAudioSessionCategoryPlayback
Allowed modes: AVAudioSessionModeDefault, AVAudioSessionModeMoviePlayback, AVAudioSessionModeSpokenAudio
Allowed options: None. Options are allowed when changing the routing policy back to Default
我在我的函数中编辑了类别和模式参数如下:
do
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault, options: [.mixWithOthers, .allowAirPlay])
print("Playback OK")
try AVAudioSession.sharedInstance().setActive(true)
print("Session is Active")
catch
print(error)
【讨论】:
以上是关于类型“字符串”没有成员“播放”的主要内容,如果未能解决你的问题,请参考以下文章
斯威夫特:'(字符串)-> AnyObject?没有名为“下标”的成员