Audio 在Swift中尝试将声音合并到信标区域内

Audio 在Swift中尝试将声音合并到信标区域内,audio,beacon,unresolved-external,Audio,Beacon,Unresolved External,我正在使用信标和区域在代码中使用未解析标识符“player”。对于这个特定区域,我还希望它播放声音(Siren.wav)。代码如下: import Combine import CoreLocation import SwiftUI import AVFoundation class BeaconDetector: NSObject, ObservableObject, CLLocationManagerDelegate { var objectWillChange = Observ

我正在使用信标和区域在代码中使用未解析标识符“player”。对于这个特定区域,我还希望它播放声音(Siren.wav)。代码如下:

import Combine
import CoreLocation
import SwiftUI
import AVFoundation

class BeaconDetector: NSObject, ObservableObject, CLLocationManagerDelegate {
    var objectWillChange =  ObservableObjectPublisher()
    var locationManager: CLLocationManager?
    var lastDistance = CLProximity.unknown
    var player: AVAudioPlayer?
    //   var audioPlayer = AVAudioPlayer()


    override init() {
        super.init()

        locationManager = CLLocationManager()
        locationManager?.delegate = self
        locationManager?.requestWhenInUseAuthorization()
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status == .authorizedWhenInUse {
            if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
                if CLLocationManager.isRangingAvailable() {
               startScanning()
                }
            }
        }
    }

    func startScanning() {
        let uuid = UUID(uuidString: "00000000-0000-0000-0000-000000000000")!
        let constraint = CLBeaconIdentityConstraint(uuid: uuid)
        let beaconRegion = CLBeaconRegion(beaconIdentityConstraint: constraint, identifier: "MyBeacon")

        locationManager?.startMonitoring(for: beaconRegion)
        locationManager?.startRangingBeacons(satisfying: constraint)
    }

    func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying beaconConstraint: CLBeaconIdentityConstraint) {
        if let beacon = beacons.first {
            update(distance: beacon.proximity)
        } else {
            update(distance: .unknown)
        }
    }

    func update(distance: CLProximity) {
        lastDistance = distance
        self.objectWillChange.send()
    }
}

struct BigText: ViewModifier {
    func body(content: Content) -> some View {
        content
                   .font(Font.system(size: 72, design: .rounded))
         .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
    }
}

struct ContentView: View {
    @ObservedObject var detector = BeaconDetector()

    var body: some View {
        if detector.lastDistance == .immediate {
            return Text("DANGER TOO CLOSE")
            .modifier(BigText())
                .background(Color.red)
                .edgesIgnoringSafeArea(.all)
            func playSound() {
                guard let url = Bundle.main.url(forResource: "Siren", withExtension: "wav") else { return }
                do {
                    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
                    try AVAudioSession.sharedInstance().setActive(true)

                    player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)
                    guard let player = player else { return }

                    player.play()

                }
                catch let error {
                    print(error.localizedDescription)
出现“未解析标识符”错误的原因是
player
变量未在
playSound()
方法中定义。在Swift语言中,每个变量声明都有一个特定的“作用域”,不能在该作用域外访问

在这种情况下,
player
被定义为
beacontector
类中的成员变量。由于
playSound()
方法不在同一变量“范围”中,因此在尝试访问该变量时会出现该错误

您可能想了解变量作用域在Swift中的工作原理