2016-03-23 3 views
0

Je reçois un mal de tête en raison de UnsafePointer dans Swift.passe dictionnaire clé à CFDictionaryGetValue

C'est la méthode que je veux appeler:

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

Et voilà comment je le fais.

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


let list = SCDynamicStoreCopyProxies(ds) 

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

Cela renvoie cependant une erreur. Je n'ai aucune idée comment passer la clé de dictionnaire à cette méthode. Si je supprime le UnsafePointer("HTTPPort") et utiliser "HTTPPort" plutôt que je reçois une erreur d'exécution. »

Comment pouvez-vous accéder aux valeurs du dictionnaire?

Répondre

1

La solution la plus simple est de profiter du numéro sans frais de transition entre CFDictionary et NSDictionary et utiliser les NSDictionary méthodes accesseurs:

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) 
    } 
} 

Mais pour être complet: Il peut être fait avec 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

Merci beaucoup. Des choses méchantes ces pointeurs dangereux. – brumbrum

+0

Il s'est avéré que le dictionnaire renvoyé est en lecture seule. Si vous avez le temps et êtes au courant de la configuration du système, n'hésitez pas à consulter http://stackoverflow.com/questions/36175502/set-current-proxy-settings – brumbrum