Tôi đang cố gắng để chuyển đổi này đoạn mã để Swift. Tôi đang vật lộn để bắt đầu vì một số khó khăn.
- (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;
}
Vấn đề đầu tiên và chính mà tôi gặp phải là về cách xác định và làm việc với C cấu trúc. Trong dòng đầu tiên ( struct sockaddr_in zeroAddress;
) của đoạn mã trên, tôi nghĩ rằng họ đang xác định một phiên bản được gọi zeroAddress
từ struct sockaddr_in (?), Tôi giả sử như vậy. Tôi đã thử khai báo var
như thế này.
var zeroAddress = sockaddr_in()
Nhưng tôi gặp lỗi Thiếu đối số cho tham số 'sin_len' trong cuộc gọi , điều này có thể hiểu được vì cấu trúc đó có một số đối số. Vì vậy, tôi đã thử lại.
var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)
Như mong đợi, tôi gặp một số lỗi khác Biến được sử dụng trong giá trị ban đầu của chính nó . Tôi cũng hiểu nguyên nhân của lỗi đó. Trong C, chúng khai báo instance trước rồi điền các tham số. Nó không khả thi trong Swift theo như tôi biết. Vì vậy, vào thời điểm này tôi thực sự không biết phải làm gì.
Tôi đã đọc tài liệu chính thức của Apple về cách tương tác với C API trong Swift nhưng không có ví dụ nào về cách làm việc với cấu trúc.
Bất cứ ai có thể vui lòng giúp tôi ra đây? Tôi thực sự đánh giá cao nó.
Cảm ơn bạn.
CẬP NHẬT: Nhờ Martin, tôi đã có thể vượt qua vấn đề ban đầu. Nhưng Swift vẫn không làm cho tôi dễ dàng hơn. Tôi nhận được nhiều lỗi mới.
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
}
CHỈNH SỬA 1: Được rồi, tôi đã thay đổi dòng này thành dòng này,
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>(), &zeroAddress)
Lỗi mới mà tôi gặp phải ở dòng này là 'UnsafePointer' không thể chuyển đổi thành 'CFAllocator' . Làm thế nào để bạn vượt qua NULL
trong Swift?
Ngoài ra, tôi đã thay đổi dòng này và lỗi đã biến mất.
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
CHỈNH SỬA 2: Tôi đã vượt qua nil
dòng này sau khi nhìn thấy câu hỏi này . Nhưng câu trả lời đó mâu thuẫn với câu trả lời ở đây . Nó nói rằng không có tương đương với NULL
trong Swift.
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)
Dù sao, tôi nhận được một lỗi mới nói rằng 'sockaddr_in' không giống với 'sockaddr' ở dòng trên.