मैं इस कोड स्निपेट को स्विफ्ट में बदलने की कोशिश कर रहा हूं । मैं कुछ कठिनाइयों के कारण मैदान से हटने पर संघर्ष कर रहा हूं।
- (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;
}
पहला और मुख्य मुद्दा मेरे पास है कि कैसे सी संरचनाओं के साथ परिभाषित और काम करना है। struct sockaddr_in zeroAddress;
उपरोक्त कोड की पहली पंक्ति ( ) में, मुझे लगता है कि वे zeroAddress
संरचना sockaddr_in (?) से बुलाए गए एक उदाहरण को परिभाषित कर रहे हैं , मुझे लगता है। मैंने var
इस तरह की घोषणा करने की कोशिश की ।
var zeroAddress = sockaddr_in()
लेकिन मुझे कॉल में पैरामीटर 'sin_len' के लिए त्रुटि मिस्ड तर्क मिलता है जो समझ में आता है क्योंकि वह संरचना कई तर्क लेती है। इसलिए मैंने फिर से कोशिश की।
var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)
जैसा कि अपेक्षित था मुझे कुछ अन्य त्रुटि प्राप्त हुई जिसका उपयोग अपने स्वयं के प्रारंभिक मूल्य के भीतर किया गया था । मैं उस त्रुटि का कारण भी समझता हूं। सी में, वे पहले उदाहरण की घोषणा करते हैं और फिर मापदंडों को भरते हैं। जहां तक मुझे पता है स्विफ्ट में यह संभव नहीं है। तो मैं वास्तव में इस बिंदु पर खो गया हूं कि क्या करना है।
मैंने स्विफ्ट में सी एपीआई के साथ बातचीत करने पर ऐप्पल के आधिकारिक दस्तावेज को पढ़ा, लेकिन इसकी संरचना के साथ काम करने में कोई उदाहरण नहीं है।
किसी को भी कृपया मेरी मदद कर सकते हैं यहाँ? मैं वाकई इसकी सराहना करूंगा।
धन्यवाद।
अद्यतन: मार्टिन के लिए धन्यवाद मैं प्रारंभिक समस्या को हल करने में सक्षम था। लेकिन फिर भी स्विफ्ट मेरे लिए इसे आसान नहीं बना रहा है। मुझे कई नई त्रुटियाँ मिल रही हैं।
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: ठीक है मैंने इस लाइन को इसमें बदल दिया,
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>(), &zeroAddress)
इस लाइन पर मुझे जो नई त्रुटि मिल रही है, वह है 'अनसेफ पॉइंटर' 'CFAllocator' के लिए परिवर्तनीय नहीं है । आप NULL
स्विफ्ट में कैसे पास होंगे ?
इसके अलावा मैंने इस लाइन को बदल दिया है और अब त्रुटि हो गई है।
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
EDIT 2: मैं इस प्रश्न को nil
देखने के बाद इस पंक्ति में गया । लेकिन वह जवाब यहां के जवाब के साथ विरोधाभासी है । इसमें कहा गया है कि स्विफ्ट में कोई समकक्ष नहीं है ।NULL
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)
वैसे भी मुझे एक नई त्रुटि यह कहते हुए मिलती है कि उपरोक्त पंक्ति में 'sockaddr_in' 'sockaddr' के समान नहीं है ।