2015-09-01 2 views
9

Я сделал игру на бета-версии Xcode 7 с помощью SpriteKit и Swift, я попытался поместить в нее аудио, но это невозможно, потому что Xcode нашел 3 ошибки, я новичок, и я не знаю, как их исправить.Как использовать аудио в приложении iOS с Swift 2?

import AVFoundation 

    var audioPlayer = AVAudioPlayer() 


    func playAudio() { 
     // Set the sound file name & extension 
     var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav")!) 

     // Preperation 
     AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil) 
     AVAudioSession.sharedInstance().setActive(true, error: nil) 

     // Play the sound 
     var error: NSError? 
     audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error) 
     audioPlayer.prepareToPlay() 
     audioPlayer.play() 
} 

Ошибка кода здесь:

Код 1:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil) 

Ошибка 1:

Extra argument 'error' in call

Код 2:

AVAudioSession.sharedInstance().setActive(true, error: nil) 

Ошибка 2:

Extra argument 'error' in call

Код 3:

audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error) 

Ошибка 3:

Cannot find an initializer for type 'AVAudioPlayer' that accepts an argument list of type '(contentsOfURL: NSURL, error: inout NSError?)'

Ваш вклад может помочь мне. Благодарю.

+0

возможно дубликат [Swift делать-примерочных поймать синтаксис] (http://stackoverflow.com/questions/30720497/swift-do-try-catch-syntax) – nalply

ответ

6

Обработка ошибок в Swift 2.0 изменилась. Фонд и другие системные среды теперь используют новый тип обработки ошибок, который использует механизм try и catch.

In Cocoa, methods that produce errors take an NSError pointer parameter last parameter, which populates its argument with an NSError object if an error occurs. Swift automatically translates Objective-C methods that produce errors into methods that throw an error according to Swift’s native error handling functionality.

Если вы посмотрите на определение функций, которые вы используете, вы увидите, что они теперь бросают. Например:

public func setActive(active: Bool) throws 

Вы можете видеть, что нет параметра ошибки, поскольку функция вызывает ошибку. Это значительно уменьшает боль при обработке NSError, а также уменьшает количество кода, который вам нужно написать.

Итак, где бы вы не увидели ошибку в качестве последнего параметра в функции, удалите ее и напишите, попробуйте! перед ней. Одним из примеров такой:

try! AVAudioSession.sharedInstance().setActive(true) 

Поскольку обработка ошибок не рамки этого вопроса, вы можете прочитать больше об этом here.

Это исправленный вариант кода Вы написали:

import AVFoundation 

var audioPlayer = AVAudioPlayer() 

func playAudio() { 
    // Set the sound file name & extension 
    let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav")!) 

    // Preperation 
    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: []) 
    try! AVAudioSession.sharedInstance().setActive(true) 

    // Play the sound 
    do { 
     try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) 
     audioPlayer.prepareToPlay() 
     audioPlayer.play() 
    } catch { 
     print("there is \(error)") 
    } 
} 
24

использовать функции внутри do catch и использовать try для метания из них:

var audioPlayer = AVAudioPlayer() 

func playAudio() { 
    do { 
     if let bundle = NSBundle.mainBundle().pathForResource("Flip 02", ofType: "wav") { 
      let alertSound = NSURL(fileURLWithPath: bundle) 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true) 
      try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 
     } 
    } catch { 
     print(error) 
    } 
} 

См this answer для полной ошибки Swift 2 обработки объяснений.

+0

Это работает, но Вы не показали как заставить звук воспроизводить его сам все время. –

+1

Я нашел решение самостоятельно. И для повтора просто нужно добавить: audioPlayer.numberOfLoops = -1. Спасибо за ваш вклад. –

0

Идея состоит в том, чтобы сделать расширение AVAudioPlayer и использовать метод для вызова любого класса.

1) Создайте пустой класс swift под названием «AppExtensions». Добавьте следующее.

// AppExtensions.swift 

    import Foundation 
    import UIKit 
    import SpriteKit 
    import AVFoundation 

    //Audio 
    var audioPlayer = AVAudioPlayer() 

    extension AVAudioPlayer { 

     func playMusic(audioFileName:String,audioFileType:String) 
     {  
      do { 

      let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(audioFileName, ofType: audioFileType)!) 

      // Removed deprecated use of AVAudioSessionDelegate protocol 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true) 
      try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 

      } 
      catch { 
       print(error) 
      } 
    } 
    } 

2) Вызвать метод расширения в любом классе.

var audioPlayer1 = AVAudioPlayer() 
audioPlayer1.playMusic(audioFileName:"tik",audioFileType:"wav")