2017-07-18 77 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) 
}() 

很多的选择。关键是你不能有一个简单的存储属性使用另一个属性的值来初始化自己。您需要通过某种方式来解决模糊问题,比如上述两种方法。