我希望此代码返回一个NSString
,其ID为当前所选输入源的ID。相反,它似乎返回了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
。如何解决此问题,以便获得正确的返回值?
TISGetInputSourceProperty()
返回一个(非托管的)原始指针,该原始指针必须转换为到CFStringRef
,而不是已取消引用与load()
:
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()
的返回值,因为该函数返回一个(+1)保留的引用,否则会出现内存泄漏。