Ich versuche, dieses Code-Snippet in Swift zu konvertieren . Ich habe aufgrund einiger Schwierigkeiten Schwierigkeiten, vom Boden abzuheben.
- (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;
}
Das erste und wichtigste Problem, das ich habe, ist das Definieren und Arbeiten mit C-Strukturen. In der ersten Zeile ( struct sockaddr_in zeroAddress;
) des obigen Codes definieren sie zeroAddress
vermutlich eine Instanz, die von der Struktur sockaddr_in (?) Aufgerufen wird. Ich habe versucht, so etwas zu erklären var
.
var zeroAddress = sockaddr_in()
Aber ich erhalte den Fehler Fehlendes Argument für den Parameter 'sin_len' im Aufruf, was verständlich ist, da diese Struktur eine Reihe von Argumenten akzeptiert . Also habe ich es erneut versucht.
var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)
Wie erwartet erhalte ich eine andere Fehlervariable, die innerhalb ihres eigenen Anfangswertes verwendet wird . 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 bin ich wirklich verloren, was ich tun soll.
Ich habe Apples offizielles Dokument über die Interaktion mit C-APIs in Swift gelesen, aber es gibt keine Beispiele für die Arbeit mit Strukturen.
Kann mir bitte jemand hier raushelfen? Ich würde es wirklich schätzen.
Danke dir.
UPDATE: Dank Martin konnte ich das ursprüngliche Problem überwinden. Trotzdem macht es Swift mir 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" und kann nicht in "CFAllocator" konvertiert werden . Wie kommst du NULL
in Swift vorbei?
Auch ich habe diese Zeile geändert und der Fehler ist jetzt weg.
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
EDIT 2: Ich habe nil
diese Zeile bestanden, nachdem ich diese Frage gesehen habe. Diese Antwort widerspricht jedoch der Antwort hier . Es heißt, es gibt kein Äquivalent zu NULL
Swift.
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)
Auf jeden Fall erhalte ich eine neue Fehlermeldung, dass 'sockaddr_in' nicht mit 'sockaddr' in der obigen Zeile identisch ist .