类型“字符串”没有成员“播放”

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?没有名为“下标”的成员

声明成员变量中的字符串与 C 字符串

Javascript:字符串化对象(包括类型函数的成员)

使用字符串类型参数访问枚举时出现 TypeScript TS7015 错误

添加字符串类型的类成员会导致调用基类函数而不是子类

数据类型总结