问题描述
我在 Swift Playground 中使用 AVFoundation 的 AVAudioEngine 和 SwiftUI,并使用 MVVM 作为架构。但是如果我在文件中分离我的结构,我会收到两个错误:执行被中断,原因:信号 SIGABRT。并且无法在范围内找到文件。所有工作的唯一方法是在同一个文件中使用它们。
这是游乐场的基本代码,我在其中调用了 MusicCreatorView。
import SwiftUI
import PlaygroundSupport
public struct StartView: View {
public var body: some View {
ZStack {
Rectangle()
.fill(Color.white)
.frame(width: 400,height: 400,alignment: .center)
NavigationView {
vstack {
NavigationLink("Start",destination: MusicCreatorView())
}
}
}
}
}
PlaygroundPage.current.setLiveView(StartView()) // error: Execution was interrupted,reason: signal SIGABRT.
AudioEngine 可以通过 StartView 找到(如果在 StartView 调用,只需将 SIGABRT 错误从 PlaygroundPage.current.setLineView() 移动到调用它的位置)但无法通过 MusicCreatorView 找到。
import Foundation
import AVFoundation
public struct AudioEngine {
public var engine = AVAudioEngine()
public var player = AVAudioPlayerNode()
public var audioBuffer: AVAudioPCMBuffer?
public var audioFormat: AVAudioFormat?
public var audioFile: AVAudioFile? {
didSet {
if let audioFile = audioFile {
audioFormat = audioFile.fileFormat
}
}
}
public var audioFileURL: URL? {
didSet {
if let audioFileURL = audioFileURL {
audioFile = try? AVAudioFile(forReading: audioFileURL)
}
}
}
public init() {
setupAudio()
}
public mutating func setupAudio() {
audioFileURL = Bundle.main.url(forResource: "EverybodysCirculation",withExtension: "mp3")
guard let format = audioFormat else { return }
engine.attach(player)
engine.connect(player,to: engine.mainmixerNode,format: format)
engine.prepare()
do {
try engine.start()
} catch {
print(error.localizedDescription)
}
}
public func scheduleAudioFile() {
guard let audioFile = audioFile else { return }
player.scheduleFile(audioFile,at: nil,completionHandler: nil)
}
public func playSound() {
player.isPlaying ? player.pause() : player.play()
}
}
尝试在 MusicCreatorView 中调用 AudioEngine
import Foundation
import SwiftUI
import AVFoundation
public struct MusicCreatorView: View {
var audioEngine = AudioEngine() // Cannot find 'AudioEngine' in scope
public init() {}
public var body: some View {
Text("Try to Create your own music")
Button("play") {
print("apertou")
audioEngine.playSound() // audioEngine <<error type>>
}
}
}
这是我的文件的组织方式 https://i.stack.imgur.com/losWf.png
解决方法
Sources 中的多个文件无法看到彼此。它们只是实际游乐场可用的独立库。您应该在真正的 iOS 项目中开发它,而不是在操场上。