意外覆盖带有快速扩展的getter - 仅在运行时应用程序再次进入前台时

时间:2018-01-16 21:13:06

标签: ios swift homekit

  

最近2天,我在我的iOS应用程序中找到了一个奇怪的行为。当你开始怀疑一切时,这是其中一个时刻。我发现了问题并修复了它。但是我想在这里写这个来搜索答案并获得有关系统背后的知识。

我是HomeKit" Controller的开发者,这是一款控制HomeKit设备的应用程序。在HomeKit中,你有 HMActionSet 来一次执行许多更改。 E.g。打开所有灯。

执行 HMActionSet 是一项基本功能,并且始终。这里只需轻扫UITableViewCell。

let performAction = UIContextualAction(style: .normal, title: AppStrings.Actions.perform, handler: { (ac: UIContextualAction, view: UIView, success: @escaping (Bool) -> Void) in
        self.home?.executeActionSet(selectedActionSet, completionHandler: { (error: Error?) in
            if let err = error {
                UIApplication.printToConsole(text: err)
                success(false)
                return
            }
            success(true)
        })
    })

但是突然间它停止了一个新的开发版本的完美运行。当我没有执行动作集时,我花了一些时间来重现这种情况。

  • 每次我从头开始使用应用程序,一切正常
  • 如果我在从前一个UIViewController导航后立即执行HMActionSet,一切正常。 (最常见的用例)
  • 在视图中
  • 停止工作,按主页按钮,重新输入应用程序。在那之后,所有的执行都不会起作用,直到再向前和向前看一个视图。

控制台记录此错误:

Error Domain=HMErrorDomain Code=2 "Object not found." UserInfo={NSLocalizedDescription=Object not found.}

我向后退了每一次提交,直到问题解决了。在一次太大的提交中深陷挖掘之后,我找到了根本原因。

但为什么我没有收到编译错误?为什么要进入主屏幕会破坏它?

对于新功能,我需要一种在多个设备上识别HomeKit对象的新方法,因为.uniqueIdentifier参数在每台设备上都有盐渍。

import Foundation
import HomeKit

protocol Identifyable {
    func getUniqueIdentifier() -> String?
}

extension HMActionSet: Identifyable {
    func getUniqueIdentifier() -> String? {
        return self.name.toBase64()
    }
}

我创建了一个swift协议并对HMActionSet进行了扩展。当然,现在我发现它看起来很愚蠢的错误,将方法命名为getter 。但这不应该是现在的讨论。看起来这个方法覆盖了 HMActionSet的属性。执行actionSet内部函数时,意外使用了错误的uniqueIdentifier,因此错误是正确的。 (没有找到对象)。

/*!
 * @brief A unique identifier for the action set.
 */
@available(iOS 9.0, *)
open var uniqueIdentifier: UUID { get }

如果我将方法命名为func uniqueIdentifier() -> String?,Xcode会立即向我显示警告。

Method 'uniqueIdentifier()' with Objective-C selector 'uniqueIdentifier' conflicts with getter for 'uniqueIdentifier' with the same Objective-C selector

据我所知,HomeKit是用Objective-C编写的。我正在使用swift 4。

我向你提问:

  • 为什么没有编译器错误(getUniqueIdentifier())?
  • 如果将swift扩展混合到objective-c框架中的运行时问题,为什么只在重新输入应用程序而不是在第一次启动时或之后发生?

期待阅读关于偷走我睡眠的问题的解释。 :)

0 个答案:

没有答案