2016-03-23 4 views
0

Я получаю головную боль из-за UnsafePointer в Swift.Перейти словарь ключ к CFDictionaryGetValue

Это метод, который я хочу, чтобы позвонить:

func CFDictionaryGetValue(theDict: CFDictionary!, _ key: UnsafePointer<Void>) -> UnsafePointer<Void> 

И это, как я это делаю.

let ds: SCDynamicStoreRef = SCDynamicStoreCreate(nil, "setNet" as CFString, nil, nil)! 


let list = SCDynamicStoreCopyProxies(ds) 

print(list!) 
print(CFDictionaryGetValue(list, UnsafePointer("HTTPPort"))) 

Это, однако, возвращает ошибку. Я не знаю, как передать словарь ключ к этому методу. Если удалить UnsafePointer("HTTPPort") и использовать "HTTPPort" вместо этого я получаю сообщение об ошибке выполнения.»

Как вы можете получить доступ к словарю значения?

ответ

1

Самое простое решение, чтобы воспользоваться по бесплатному преодолению между CFDictionary и NSDictionary и использовать NSDictionary методы доступа:

let ds = SCDynamicStoreCreate(nil, "setNet", nil, nil)! 

if let list = SCDynamicStoreCopyProxies(ds) as NSDictionary? { 
    if let port = list[kSCPropNetProxiesHTTPPort as NSString] as? Int { 
     print("HTTPPort:", port) 
    } 
} 

Но только ради полноты: Это может быть сделано с CFDictionaryGetValue

if let list = SCDynamicStoreCopyProxies(ds) { 
    let key = kSCPropNetProxiesHTTPPort 
    let port = unsafeBitCast(CFDictionaryGetValue(list, unsafeAddressOf(key)), NSObject!.self) 
    if port != nil { 
     print("HTTPPort:", port) 
    } 
} 
+0

Большое вам спасибо. Грязные вещи эти небезопасные указатели. – brumbrum

+0

Оказалось, что возвращаемый словарь читается только. Если у вас есть время и вы знаете о структуре конфигурации системы, не стесняйтесь смотреть http://stackoverflow.com/questions/36175502/set-current-proxy-settings – brumbrum