消除力量展开的最佳方法

San*_*ndy -1 optional ios swift forceunwrap

var recorder : Recorder? = nil

func startAudioRecording() {
    if recorder == nil {
        recorder = Recorder()
    }
    if !recorder!.isRunning() {
        recorder?.startRecording({ [weak self] audioData in
            self?.remoteInterface?.sendVoice(audioData.0)
        }, withCompletionBlock: { (_) in })
    }
}

func stopAudioRecording(_ keyCommand: String!){
    if let _ = recorder {
        if(recorder?.isRunning())! {
            recorder?.stopRecording(completionBlock: { (isFinished: Bool) in
                DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + Double(Int64(1 * NSEC_PER_MSEC)) / Double(NSEC_PER_SEC), execute: { [unowned self] in
                    self.remoteInterface?.sendTouchUp(keyCommand)
                    self.audioRecorder = nil
                })
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们如何解除力量打开?

Mil*_*sáľ 5

您可以使用if let(或替代guard let)处理的第一个:

if let recorder = recorder {
    // here it is unwrapped
} else {
    // handle nil case
}
Run Code Online (Sandbox Code Playgroud)

在第二个我将使用默认值:

if (recorder?.isRunning() ?? false) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我发现你已经if let在第二种情况下使用了,所以你不需要那样做.所以我认为if let两者都是最好的,所以也许是这样的:

var recorder : Recorder? = nil

func startAudioRecording(){
    if recorder == nil {
        recorder = Recorder()
    }
    if let recorder = recorder,
        !recorder.isRunning() {

        recorder.startRecording({ [weak self] audioData in
            self?.remoteInterface?.sendVoice(audioData.0)
        }, withCompletionBlock: { (_) in })
    }
}

func stopAudioRecording(_ keyCommand: String!){
    if let recorder = recorder,
        recorder.isRunning() {

        recorder.stopRecording(completionBlock: { (isFinished: Bool) in
            DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + Double(Int64(1 * NSEC_PER_MSEC)) / Double(NSEC_PER_SEC), execute: { [unowned self] in
                self.remoteInterface?.sendTouchUp(keyCommand)
                self.audioRecorder = nil
            })
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,正如@Fogmaster所指出的,guard在第二种方法中使用可能看起来更好一些:

func stopAudioRecording(_ keyCommand: String!){
    guard let recorder = recorder,
        recorder.isRunning() else {
        return
    }

    recorder.stopRecording(completionBlock: { (isFinished: Bool) in
        DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + Double(Int64(1 * NSEC_PER_MSEC)) / Double(NSEC_PER_SEC), execute: { [unowned self] in
            self.remoteInterface?.sendTouchUp(keyCommand)
            self.audioRecorder = nil
        })
    })
}
Run Code Online (Sandbox Code Playgroud)