나는 이것을 변환하려고 해요 코드 스 니펫을 Swift . 나는 약간의 어려움 때문에 땅에서 내리는 데 어려움을 겪고있다.
- (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;
}
내가 가진 첫 번째이자 주요 문제는 C 구조체를 정의하고 사용하는 방법입니다. struct sockaddr_in zeroAddress;
위 코드 의 첫 번째 줄 ( )에서 나는 그들이 zeroAddress
sockaddr_in (?) 구조체에서 호출 된 인스턴스를 정의하고 있다고 생각합니다. 나는 var
이와 같은 선언을 시도 했습니다.
var zeroAddress = sockaddr_in()
그러나 해당 구조체가 여러 인수를 사용하기 때문에 이해할 수 있는 호출에서 매개 변수 'sin_len'에 대한 Missing 인수 오류가 발생 합니다. 그래서 다시 시도했습니다.
var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)
예상대로 자체 초기 값 내에서 사용되는 다른 오류 변수가 있습니다. . 그 오류의 원인도 이해합니다. C에서는 먼저 인스턴스를 선언 한 다음 매개 변수를 채 웁니다. 내가 아는 한 Swift에서는 불가능합니다. 그래서 저는이 시점에서 무엇을해야할지 정말로 길을 잃었습니다.
Swift에서 C API와의 상호 작용에 대한 Apple의 공식 문서 를 읽었 지만 구조체 작업에 대한 예제가 없습니다.
누구든지 여기서 나를 도울 수 있습니까? 정말 감사하겠습니다.
감사합니다.
업데이트 : Martin 덕분에 초기 문제를 극복 할 수있었습니다. 그러나 여전히 Swift는 나를 더 쉽게 만들지 않습니다. 여러 개의 새로운 오류가 발생합니다.
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
}
편집 1 : 좋아이 줄을 이것으로 변경했습니다.
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>(), &zeroAddress)
이 줄에서 얻는 새로운 오류는 'UnsafePointer'가 'CFAllocator'로 변환되지 않습니다 . 통과하는 방법NULL
Swift를 어떻게 합니까?
또한이 줄을 변경하고 오류가 사라졌습니다.
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
편집 2 : 이 질문 nil
을 본 후이 줄을 통과 했습니다 . 그러나 그 대답은 여기 의 대답과 모순 됩니다 . 그것은 Swift에 상응하는 것이 없다고 말합니다 .NULL
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)
어쨌든 위 줄에서 'sockaddr_in'이 'sockaddr'과 동일하지 않다는 새로운 오류가 발생 합니다.