You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效重构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:20:29