首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建“`EAAccessory`”对象而不连接到真正的蓝牙设备?

如何创建“`EAAccessory`”对象而不连接到真正的蓝牙设备?
EN

Stack Overflow用户
提问于 2018-12-07 09:19:24
回答 1查看 337关注 0票数 2

我正在编写单元测试用例,测试模块中需要EAAccessory对象。

因此,我尝试创建EAAccessory对象,而不连接到真正的蓝牙设备和EAAccessoryManager,但是我无法将isConnectedserialNumber分配给EAAccessory实例,因为这些都是只读变量。

因此,我决定模拟EAAccessory类,并通过继承EAAccessory类和重写isConnectedserialNumber变量来返回自己的值,从而创建了EAAccessory类。

我认为一切都很好,因为没有编译器错误。但是我收到了下面给出的运行时错误。

捕获"EAAccessoryInitException","-init不支持。EAAccessoryManager负责创建所有对象。“

所以,有人能引导我模拟EAAccessory类吗?或者,如果没有其他方法可以创建EAAccessory对象,而不需要模拟,也不需要连接到真正的蓝牙设备?

EN

回答 1

Stack Overflow用户

发布于 2019-12-10 15:03:11

不幸的是,在创建您自己的EAAccessory对象实例或子类方面,您不会有太大的运气。还有一种更好的模拟方式,这不需要接触EAAccessory类本身(嗯,几乎)。

最简单的方法是定义一个包含所需的所有EAAccessory值的协议,然后为符合新协议的EAAccessory类定义一个空扩展,如下所示:

代码语言:javascript
复制
protocol MyAccessory {
    var isConnected: Bool { get }
    var serialNumber: String { get }
}

extension EAAccessory: MyAccessory {}

然后,如果使用EAAccessoryDidConnect通知侦听附件,则可以将userInfo字典中的值解压缩为新的协议类型,而不是EAAccessory

代码语言:javascript
复制
let myAccessoryObject = notification.userInfo?[EAAccessoryKey] as? MyAccessory

为了测试和模拟附件,现在您需要做的就是创建一个符合MyAccessory协议而不是EAAccessory类的新类或结构:

代码语言:javascript
复制
struct MockAccessory: MyAccessory {
    let name: String
    let protocolStrings: [String]
}

func testSendingNotifications() {
    let userInfo: [AnyHashable: Any] = [
        EAAccessoryKey: MockAccessory(isConnected: true, serialNumber: "cocoa-puffs")
    ]
    NotificationCenter.default.post(name: NSNotification.Name.EAAccessoryDidConnect,
                                    object: nil,
                                    userInfo: userInfo)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53666524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档