2017-07-18 5 views
1

J'ai essayé d'ajouter la fonction de l'objectif c à swift juste comme ici https://stackoverflow.com/a/29440193/7395969 et j'ai converti la méthode d'appel à Swift comme indiqué ci-dessous. Mais j'ai une erreur: Impossible de convertir la valeur de type 'in_addr_t' (alias 'UInt32') en type d'argument attendu 'UnsafeMutablePointer!' sur cette ligne: let r: Intswift Impossible de convertir la valeur de type 'in_addr_t' (alias 'UInt32') en type d'argument attendu 'UnsafeMutablePointer <in_addr_t>!'

func getGatewayIP() -> String { 
    var ipString: String? = nil 

    let gatewayaddr: in_addr 
    let r: Int = getdefaultgateway((gatewayaddr.s_addr)) 
    if r >= 0 { 
     ipString = "\(inet_ntoa(gatewayaddr))" 
     print("default gateway : \(ipString)") 
    } 
    else { 
     print("getdefaultgateway() failed") 
    } 
    return ipString! 
} 

Répondre

2

Vous devez passer l'adresse de gatewayaddr.s_addr comme argument inout avec &. De plus, le gatewayaddr doit être initialisés:

var gatewayaddr = in_addr() 
let r = getdefaultgateway(&gatewayaddr.s_addr) 

Notez que l'interpolation de chaîne

ipString = "\(inet_ntoa(gatewayaddr))" 

ne fonctionnera pas pour convertir la chaîne C à un Swift String, vous devez appeler String(cString:). Également

return ipString! 

se bloquera si la passerelle n'a pas pu être déterminée.

Exemple d'une version sûre:

func getGatewayIP() -> String? { 
    var gatewayaddr = in_addr() 
    let r = getdefaultgateway(&gatewayaddr.s_addr) 
    if r >= 0 { 
     return String(cString: inet_ntoa(gatewayaddr)) 
    } else { 
     return nil 
    } 
} 

if let gateway = getGatewayIP() { 
    print("default gateway", gateway) 
} else { 
    print("getGatewayIP() failed") 
} 
+0

Merci, maintenant erreur est parti, mais je reçois la valeur comme cette option (0x00000001af342ca0), comment dois-je convertir en addresss normale IP de la passerelle? –

+0

@EgleMatutyte: Voir mise à jour. –

+0

Merci mon pote, travail parfait, c'est complètement ce que je cherchais depuis quelques jours !!! –