So verwenden Sie SCNetworkReachability in Swift

Ich versuche zu konvertierenDie Code-Snippet zu Swift. Aufgrund einiger Schwierigkeiten habe ich Probleme, mich auf den Weg zu machen.

- (BOOL) connectedToNetwork
{
    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags)
    {
        return NO;
    }

    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;

    return (isReachable && !needsConnection) ? YES : NO;
}

Die erste und wichtigste Frage, die ich habe, ist, wie man C-Strukturen definiert und mit ihnen arbeitet. In der ersten Zeile struct sockaddr_in zeroAddress;) des obigen Codes, ich denke, sie definieren eine Instanz mit dem NamenzeroAddress von der Struktur sockaddr_in (?) nehme ich an. Ich habe versucht, ein @ zu deklariervar so was

var zeroAddress = sockaddr_in()

Aber ich bekomme den Fehler Fehlendes Argument für Parameter 'sin_len' in Aufruf, was verständlich ist, weil diese Struktur eine Reihe von Argumenten akzeptiert. Also habe ich es nochmal versucht.

var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)

Wie erwartet bekomme ich einen anderen FehlerVariable wird innerhalb seines eigenen Anfangswerts verwendet. Ich verstehe auch die Ursache dieses Fehlers. In C deklarieren sie zuerst die Instanz und füllen dann die Parameter aus. Soweit ich weiß, ist das in Swift nicht möglich. An diesem Punkt habe ich wirklich keine Ahnung, was ich tun soll.

Ich lese Apples offiziellendokumentiere zur Interaktion mit C-APIs in Swift, aber es gibt keine Beispiele für die Arbeit mit Strukturen.

Kann mir bitte jemand hier raushelfen? Ich würde es wirklich zu schätzen wissen.

Vielen Dank

AKTUALISIEREN Dank Martin konnte ich das anfängliche Problem überwinden. Aber Swift macht es mir trotzdem nicht leichter. Ich erhalte mehrere neue Fehler.

func connectedToNetwork() -> Bool {

    var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
    zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)

    var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>, UnsafePointer<zeroAddress>) // 'zeroAddress' is not a type
    var flags = SCNetworkReachabilityFlags()

    let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, UnsafeMutablePointer<flags>) // 'flags' is not a type
    defaultRouteReachability.dealloc(1) // 'SCNetworkReachabilityRef' does not have a member named 'dealloc'

    if didRetrieveFlags == false {
        return false
    }

    let isReachable: Bool = flags & kSCNetworkFlagsReachable // Cannot invoke '&' with an argument list of type '(@lvalue UInt32, Int)'
    let needsConnection: Bool = flags & kSCNetworkFlagsConnectionRequired // Cannot invoke '&' with an argument list of type '(@lvalue UInt32, Int)'

    return (isReachable && !needsConnection) ? true : false
}

EDIT 1: Okay, ich habe diese Zeile in diese geändert,

var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>(), &zeroAddress)

Der neue Fehler, den ich in dieser Zeile erhalte, ist 'UnsafePointer' kann nicht in 'CFAllocator' konvertiert werden. Wie Sie @ übergebNULL in Swift?

Auch ich habe diese Zeile geändert und der Fehler ist jetzt weg.

let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)

EDIT 2: Ich bestandnil in dieser Zeile nach dem Sehen vonDie frage. Aber diese Antwort widerspricht der AntwortHie. Es heißt, es gibt kein Äquivalent zuNULL in Swift.

var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)

uf jeden Fall erhalte ich eine neue Fehlermeldung mit der Aufschrift 'sockaddr_in' ist nicht identisch mit 'sockaddr' in der obigen Zeile.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage