Swift: CFArray: get values ​​as UTF strings

I call some functions that return values CFArrayfrom CFStringRef. I need to get utf strings from them. Since I did not want my code to be too complicated, I did the following:

let initString = "\(TISCreateInputSourceList(nil, false).takeUnretainedValue())"

And then I just split the resulting string by \nto get an array of Swift strings. However, when the function started returning strings other than ascii, a problem arose. I started getting strings like "\ U2345 \ U2344".

Then I tried to take a CFArray and iterate over it, getting the values ​​and maybe converting them to strings, but I can't get the values ​​from it:

        let ar = TISCreateInputSourceList(nil, true).takeUnretainedValue()
        for i in 0...CFArrayGetCount(ar) - 1 {
            print(">> ( CFArrayGetValueAtIndex(ar, i).memory )")
        }

The values ​​are always empty.

How can I get the actual values?

+2
1

. -, TISCreateInputSourceList() "" , , (+1) , takeRetainedValue(), takeUnretainedValue(), :

let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue()

CFArray... , NSArray ( " " ):

let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue() as NSArray

CFStringRef, TISInputSource . NSArray Swift:

let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue()
                    as NSArray as! [TISInputSource]

as! , , .

:

for src in srcs  {
    // do something with `src` (which is a `TISInputSource`)
}

TISGetInputSourceProperty(), :

let ptr = TISGetInputSourceProperty(src, kTISPropertyInputSourceID)

" void" (UnsafeMutablePointer<Void>), ( CFStringRef kTISPropertyInputSourceID). , ( self UnsafeMutablePointer <Void> type swift):

let val = Unmanaged<CFString>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue()

, CFStringRef NSString String:

let val = Unmanaged<CFString>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue()
                    as String

:

let srcs = TISCreateInputSourceList(nil, true).takeRetainedValue()
                as NSArray as! [TISInputSource]
for src in srcs  {
    let ptr = TISGetInputSourceProperty(src, kTISPropertyInputSourceID)
    let val = Unmanaged<CFString>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue()
                as String
    print(val)
}
+7

Source: https://habr.com/ru/post/1626721/


All Articles