Swift UnsafeMutableRawPointer returns class 而不是实例

Swift UnsafeMutableRawPointer returns class instead of instance

我希望此代码 return 具有当前所选输入源 ID 的 NSString。相反,它似乎 return NSString 类 本身之一。

import Foundation
import Carbon

let current = TISCopyCurrentKeyboardInputSource().takeUnretainedValue()

let id = TISGetInputSourceProperty(current, kTISPropertyInputSourceID).load(as: NSString.self)
id.length

当我在我的 macOS 应用程序中 运行 时,我在日志中收到此错误消息:+[__NSCFConstantString _fastCStringContents:]: unrecognized selector sent to class 0x7fff92cf79e8。我该如何解决这个问题才能获得正确的 returned 值?

TISGetInputSourceProperty() returns 一个(非托管)原始指针,必须 convertedCFStringRef,而不是 load() 取消引用 。然后 CFString 可以桥接到 Swift String.

let current = TISCopyCurrentKeyboardInputSource().takeRetainedValue()
if let ptr = TISGetInputSourceProperty(current, kTISPropertyInputSourceID) {
    let id = Unmanaged<CFString>.fromOpaque(ptr).takeUnretainedValue() as String
    print(id) // com.apple.keylayout.German
}

另请注意,takeRetainedValue() 必须用于 TISCopyCurrentKeyboardInputSource() 的 return 值,因为该函数 return 是 (+1) 保留引用,否则您将内存泄漏。