2017-07-18 119 views
1

在我的課,我有一個屬性,它是一種audioPlayer的,我打算做的設置工作在一個封閉的這樣:問題變封閉初始化問題

var urlPath = Bundle.main.url(forResource: "Focus", withExtension: "mp3")! 

var audioPlayer:AVAudioPlayer = { var player = try! AVAudioPlayer.init(contentsOf: urlPath) 

    return player }() 

實例成員「 urlPath BackgroundAudio」不能在類型中使用「

enter image description here

我不太明白什麼是錯我的代碼?如何解決此問題,提前致謝。

+1

@Rob主持人今年在堆棧溢出提名階段的選舉正在進行中,希望你能在那裏看到作爲主持人的提名。 –

回答

1

試試這個:

import AudioToolbox 
import AVFoundation 

let url = Bundle.main.url(forResource: "Focus", withExtension: "mp3")! 

    do { 
     player = try AVAudioPlayer(contentsOf: url) 
     guard let player = player else { return } 

     player.prepareToPlay() 
     player.play() 
    } catch let error as NSError { 
     print(error.description) 
    } 
0

有代碼中的語法錯誤。由於audioPlayer是一個計算屬性,您不應該有=

var audioPlayer:AVAudioPlayer = { var player = try! AVAudioPlayer.init(contentsOf: urlPath) 

    return player }() 

var audioPlayer: AVAudioPlayer { 
    var player = try! AVAudioPlayer(contentsOf: urlPath) 
    return player 
} 
+0

這很好,但它沒有解決OPs問題的根源,methinks。 – Rob

0

正確的,它說,在初始化過程中不能使用其他存儲的屬性,因爲如果它被初始化它不知道被寫或不。正如The Swift Programming Language所示:

如果使用閉包來初始化某個屬性,請記住該閉包在執行時尚未初始化其他實例。這意味着即使這些屬性具有默認值,您也無法從閉包中訪問任何其他屬性值。您也不能使用隱含的self屬性,或者調用任何實例的方法。

您可以通過audioPlayer一個lazy VAR解決這個問題,所以初始化被推遲到您第一次使用它,解決歧義。例如。

var urlPath = Bundle.main.url(forResource: "Focus", withExtension: "mp3")! 
lazy var audioPlayer: AVAudioPlayer = try! AVAudioPlayer(contentsOf: self.urlPath) 

或者,如果你並不需要在其他地方這個URL參考,你可以有一個常數:

let audioPlayer: AVAudioPlayer = { 
    var urlPath = Bundle.main.url(forResource: "Focus", withExtension: "mp3")! 
    return try! AVAudioPlayer(contentsOf: urlPath) 
}() 

很多的選擇。關鍵是你不能有一個簡單的存儲屬性使用另一個屬性的值來初始化自己。您需要通過某種方式來解決模糊問題,比如上述兩種方法。