2016-11-10 6 views
1

일반적으로 AVAudioPlayer 자습서 온라인은 AVAudioPlayer 개체의 재생 및 중지 기능을 다른 기능에서 직접 사용할 수없는 기능 내에서 AVAudioPlayer 함수를 만듭니다. 문제는 다른 기능이 AVAudioPlayer에서 소리를 멈추길 바란다는 것입니다. 이 클래스의 최상위에있는 객체를 초기화하여 매우 간단하게 보이지만, Swift3initAVAudioPlayer의 함수는 throw이며 사운드 파일의 매개 변수를 포함합니다. Swift는 속성 이니셜 라이저 내에서 인스턴스 멤버를 사용할 수 없기 때문에이 방법을 작성하는 방법에 대한 내 생각을 고수했습니다. 둘 이상의 함수에서 사용할 AVAudioPlayer 초기화

나는이 시점에서 실행 해요 유일한 오류

는 "backgroundMusicPlayer"를 만들 때 속성 초기화에서 인스턴스 멤버를 사용할 수되지 않는 :

import UIKit 
import AVFoundation 

class MadLibOneViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet weak var thePlace: UITextField! 
    @IBOutlet weak var theVerb: UITextField! 
    @IBOutlet weak var theNumber: UITextField! 
    @IBOutlet weak var theTemplate: UITextView! 
    @IBOutlet weak var theStory: UITextView! 
    @IBOutlet weak var generateStoryButton: UIButton! 
    @IBOutlet weak var proceedToNextMadLib: UIButton! 
    //var backgroundMusicPlayer = AVAudioPlayer() 

    var error:NSError? 

    var path = Bundle.main.path(forResource: "bensound-cute", ofType: "mp3") 

    var url: NSURL { 
     return NSURL(fileURLWithPath: path!) 
    } 

    var backgroundMusicPlayer: AVAudioPlayer = try AVAudioPlayer(contentsOf: url as URL, error: &error) 





    @IBAction func createStory(_ sender: AnyObject) { 
     theStory.text=theTemplate.text 
    theStory.text=theStory.text.replacingOccurrences(of: "<place>", with: thePlace.text!) 
     theStory.text=theStory.text.replacingOccurrences(of: "<verb>", with: theVerb.text!) 
     theStory.text=theStory.text.replacingOccurrences(of: "<number>", with: theNumber.text!) 

     generateStoryButton.isHidden=true 
     proceedToNextMadLib.isHidden=false 

    } 

    @IBAction func showNextStory(_ sender: AnyObject) { 

     view.backgroundColor=UIColor.green 

     let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
     let resultViewController = storyBoard.instantiateViewController(withIdentifier: "MadLibTwoViewController") as! MadLibTwoViewController 
     self.present(resultViewController, animated:true, completion:nil) 

    } 

    @IBAction func hideKeyboard(_ sender: AnyObject) { 
     thePlace.resignFirstResponder() 
     theVerb.resignFirstResponder() 
     theNumber.resignFirstResponder() 
     theTemplate.resignFirstResponder() 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     proceedToNextMadLib.isHidden=true 
     view.backgroundColor = UIColor.purple 


     // Do any additional setup after loading the view. 
     self.theVerb.delegate = self 
     self.thePlace.delegate = self 
     self.theNumber.delegate = self 

    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     self.view.endEditing(true) 
     return false 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

답변

1

당신은 그것에 대해 Lazy initialisation/instantiation를 사용해야합니다. 귀하의 경우에는 이것이 모두 당신이해야 할 일입니다. 더에 대한 Lazy Initialisationthis를 들어

lazy var player: AVAudioPlayer = { 
    [unowned self] in 
    do { 
     return try AVAudioPlayer.init(contentsOf: self.url) 
    } 
    catch { 
     return AVAudioPlayer.init() 
    } 

}() 

좋은 읽기입니다. 귀하의 경우 재미있는 점은 초기화 자 throws입니다. 나는 this forum discussion이 약간의 아이디어를 갖는 데 도움이된다고 생각합니다.

+0

이렇게 컴파일됩니다. 나는 게으른 사용 시도를했지만 init이 던진 이후로 작동하도록 만드는 방법을 이해하지 못했습니다. '재미있는'단어를 어떤 문맥에서 사용하고 있습니까? 나의 사소한 경험에서, 나는 init 함수를 던져서 스스로와 같은 멍청한 것들을 복잡하게 만들 것이라고 생각하지만, 자신과 같은 노련한 개발자가 이것을 선호하거나 흥미 롭다고 생각하는 이유가 무엇인가? @Adeel –

+1

하하! throw하는 이니셜 라이저를 사용하는 것은 preference @ user6510422가 아닙니다. 이 경우에 그렇게 된 것입니다. 조금 도전적 이었기 때문에 재미있었습니다. 그리고 그것은 초보자 또는 노련한 태도보다는 오히려 태도에 이릅니다. "모든 주인은 한때 초보자였다"는 말을 들었을 것입니다. 일단 나는 초심자이었다. – Adeel