大佬教程收集整理的这篇文章主要介绍了ios – 使用Swift的C API,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
- (void)setHost:(NSString *)host { if (host != _host) { if (_reachability) { SCNetworkReachabilityUnscheduleFromRunLoop(_reachability,CFRunLoopGetMain(),kcfRunLoopCommonModes); CFRelease(_reachability); } _host = [host copy]; _status = FXReachabilityStatusUnkNown; _reachability = SCNetworkReachabilityCreateWithName(kcfAllocatorDefault,[_host UTF8String]); SCNetworkReachabilityContext context = { 0,( __bridge void *)self,NULL,NULL }; SCNetworkReachabilitySetCallBACk(_reachability,ONEReachabilityCallBACk,&context); SCNetworkReachabilityscheduleWithRunLoop(_reachability,kcfRunLoopCommonModes); } }
它的作用是不断检查与指定主机的连接.我正在尝试将此方法转换为Swift,我遇到了一些问题.
1.将主机字符串转换为UTF8.
我必须将主机字符串转换为UTF8并将其传递给SCNetworkReachabilityCreateWithName方法.我无法在Objective-C中找到Swift等效的UTF8String属性.但是String类型有一个名为utf8的属性.根据documentation,
如何获得字符串的完整UTF8表示而不是无符号8位(UInt8)值的集合?
2. SCNetworkReachabilitySetCallback的回调函数.
此函数的第二个参数需要某种类型的SCNetworkReachabilityCallBACk.我潜入了源文件,发现它实际上是一个类型.
typealias SCNetworkReachabilityCallBACk = CFunctionPointer<((SCNetworkReachability!,SCNetworkReachabilityFlags,UnsafeMutablePointer<Void>) -> Void)>
我这样定义了.
let reachabilityCallBACk: SCNetworkReachabilityCallBACk = { }()
但是我得到了一个错误,在一个闭包中返回错误返回’SCNetworkReachabilityCallBACk’,当在该类型中你可以清楚地看到它返回Void.
这些是我面临的问题.我已经在这几个小时了,没有运气,所以我真的很感激任何帮助.
谢谢.
let reachability = host.withCString { SCNetworkReachabilityCreateWithName(nil,$0).takeRetainedValue() }
在闭包内部,$0是指向NUL终止的UTF-8表示的指针
串.
更新:正如Nate Cook所述
一个现已删除的答案,也是here,
你实际上可以将Swift字符串传递给一个采用UnsafePointer< UInt8>的函数.
直:
let reachability = SCNetworkReachabilityCreateWithName(nil,host).takeRetainedValue()
不幸的是(据我所知)目前没有解决你的第二个问题.
SCNetworkReachabilitySetCallBACk期望指向C函数的指针为秒
参数,目前没有传递Swift函数或闭包的方法.
请注意07002的文档
仅显示Objective-C但没有Swift.
另见Does Swift not work with function pointers?.
更新Swift 2:现在可以传递一个Swift闭包
采用函数指针参数的C函数.也
SCNetworkReachabilityCreateWithName()
不再返回非托管对象:
let host = "google.com" var context = SCNetworkReachabilityContext(version: 0,info: nil,retain: nil,release: nil,copyDescription: nil) let reachability = SCNetworkReachabilityCreateWithName(nil,host)! SCNetworkReachabilitySetCallBACk(reachability,{ (_,flags,_) in print(flags) },&context) SCNetworkReachabilityscheduleWithRunLoop(reachability,kcfRunLoopCommonModes)
更新Swift 3(Xcode 8):
let host = "google.com" var context = SCNetworkReachabilityContext(version: 0,_) in print(flags) },&context) SCNetworkReachabilityscheduleWithRunLoop(reachability,CFRunLoopMode.commonModes.rawvalue)
以上是大佬教程为你收集整理的ios – 使用Swift的C API全部内容,希望文章能够帮你解决ios – 使用Swift的C API所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。