如何使“变量未使用”警告静音并保持强烈的参考作用?

时间:2019-06-03 13:51:20

标签: swift

我想使我警告不要使用timer而不使用_ = DispatchSource.createRepeating变量,最好不要打印或以多余的方式使用它。

func testTimerIsStarted() {
    let expectation = self.expectation(description: #function)

    let timer = DispatchSource.createRepeating(interval: 0, deadline: DispatchTime.now()) {
        expectation.fulfill()
    }
    waitForExpectations(timeout: 0.02)
}
  

从未使用过对不可变值'timer'的初始化;   考虑将其替换为“ _”或将其删除

不使用_的原因是因为没有强大的参考,我的期望就无法实现,因为DispatchSource会立即发布而没有强大的参考。

DispatchSourceExtension

extension DispatchSource {
    public static func createRepeating(interval: Double,
                                       deadline: DispatchTime = .now(),
                                       queue: DispatchQueue = .main,
                                       mockTimer: DispatchSourceTimerScheduler? = nil,
                                       handler: @escaping () -> Void) -> DispatchSourceTimerScheduler {
        guard let timer = mockTimer ?? DispatchSource.makeTimerSource(queue: queue) as? DispatchSourceTimerScheduler else {
            preconditionFailure("DispatchSourceTimer no longer complies with DispatchSourceTimerScheduler")
        }
        let leeway = estimateLeeway(for: interval)
        timer.schedule(deadline: deadline, repeating: interval, leeway: leeway)
        timer.setEventHandler(qos: .unspecified, flags: [], handler: handler)
        timer.resume()

        return timer
    }
}

1 个答案:

答案 0 :(得分:4)

我认为这是withExtendedLifetime(_:_:)全局函数的用例。

func testTimerIsStarted() {
    let expectation = self.expectation(description: #function)

    let timer = DispatchSource.createRepeating(interval: 0, deadline: DispatchTime.now()) {
        expectation.fulfill()
    }

    withExtendedLifetime(timer) { timer in
        waitForExpectations(timeout: 0.02)
    }
}

但是,总的来说,我不喜欢这种方法。这需要更多的精力,但是我认为这样的测试应该使用模拟时间,这样可以防止实际产生线程,等待“真实”时间过去等等。在执行此操作时,如果您在系统负载较高的时期执行单元测试(例如,并行运行测试,或者如果您正在启动其他进程),则测试将失败。因此,使用模拟时间更可靠,更不用说更快了。