如何高效重构Swift代码以减少冗余?
简化键盘A/B键互映射代码方案
这段代码实现了键盘A键与B键的相互映射,通过SwiftUI开关控制开启/关闭。原代码中,创建HID事件客户端、遍历并筛选键盘服务客户端的逻辑重复出现在多个函数中,以下是简化后的实现方案:
核心逻辑简化版
import IOKit.hid // 定义按键常量 let aKey: UInt64 = 0x700000004 let bKey: UInt64 = 0x700000005 // 筛选键盘服务客户端的工具函数 private func isKeyboardService(_ client: IOHIDServiceClient) -> Bool { let usagePage = UInt32(kHIDPage_GenericDesktop) let usage = UInt32(kHIDUsage_GD_Keyboard) return IOHIDServiceClientConformsTo(client, usagePage, usage) == 1 } // 提取重复逻辑:获取所有键盘服务客户端 private func getAllKeyboardServiceClients() -> [IOHIDServiceClient] { let eventSystemClient = IOHIDEventSystemClientCreateSimpleClient(kCFAllocatorDefault) return IOHIDEventSystemClientCopyServices(eventSystemClient) as? [IOHIDServiceClient] ?? [] } // 封装键映射更新逻辑 private func updateKeyMapping(for clients: [IOHIDServiceClient], with map: [[String: UInt64]]) { clients.forEach { client in IOHIDServiceClientSetProperty(client, kIOHIDUserKeyUsageMapKey as CFString, map as CFArray) } } // 检查是否已完成A/B互映射 func areKeysMapped() -> Bool { let keyboardClients = getAllKeyboardServiceClients() for client in keyboardClients { guard let keyMapping = IOHIDServiceClientCopyProperty(client, kIOHIDUserKeyUsageMapKey as CFString) as? [[String: UInt64]] else { continue // 跳过无映射配置的客户端,继续检查其他键盘 } let hasAToB = keyMapping.contains { $0[kIOHIDKeyboardModifierMappingSrcKey] == aKey && $0[kIOHIDKeyboardModifierMappingDstKey] == bKey } let hasBToA = keyMapping.contains { $0[kIOHIDKeyboardModifierMappingSrcKey] == bKey && $0[kIOHIDKeyboardModifierMappingDstKey] == aKey } if hasAToB && hasBToA { return true } } return false } // 创建A/B互映射的配置 private func createABSwapMapping() -> [[String: UInt64]] { return [ [kIOHIDKeyboardModifierMappingSrcKey: aKey, kIOHIDKeyboardModifierMappingDstKey: bKey], [kIOHIDKeyboardModifierMappingSrcKey: bKey, kIOHIDKeyboardModifierMappingDstKey: aKey] ] } // 开启A/B互映射 func remapABBA() { let keyboardClients = getAllKeyboardServiceClients() let mapping = createABSwapMapping() updateKeyMapping(for: keyboardClients, with: mapping) } // 重置按键映射 func resetKeyMapping() { let keyboardClients = getAllKeyboardServiceClients() updateKeyMapping(for: keyboardClients, with: []) }
简化要点
- 提取
getAllKeyboardServiceClients():将重复的创建HID客户端、获取服务列表、筛选键盘的逻辑统一封装,彻底消除代码冗余。 - 拆分
updateKeyMapping:将遍历客户端和设置映射的逻辑分离,职责更单一,便于后续扩展。 - 封装
createABSwapMapping:把映射配置的创建单独抽离,后续修改按键映射规则只需改动这一处。 - 优化
areKeysMapped逻辑:原代码遇到无映射的客户端直接返回false,改为跳过该客户端继续检查其他键盘,适配多键盘场景下的判断逻辑。
SwiftUI界面简化版
import SwiftUI struct ContentView: View { @State private var remapKeys = areKeysMapped() var body: some View { HStack { Spacer() Toggle("Remap A ↔️ B", isOn: $remapKeys) .toggleStyle(SwitchToggleStyle()) .onChange(of: remapKeys) { isEnabled in isEnabled ? remapABBA() : resetKeyMapping() } Spacer() } .padding() } }
界面简化要点
- 简化Toggle写法,直接使用字符串作为标签,代码更简洁。
- 将开关状态变化的逻辑直接内联到
onChange回调中,去掉冗余的中间函数。
内容的提问来源于stack exchange,提问作者Tzar
相关产品推荐
相关产品推荐

