
- (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,
You can access a UTF-8 representation of a String by iterating over its utf8 property. This property is of type String.UTF8VIEw,which is a collection of unsigned 8-bit (UInt8) values,one for each byte in the string’s UTF-8 representation:
如何获得字符串的完整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,let reachability = SCNetworkReachabilityCreateWithname(nil,host).takeRetainedValue()
).takeRetainedValue()} 在闭包内部,$0是指向Nul终止的UTF-8表示的指针
串.
更新:正如Nate Cook所述
一个现已删除的答案,也是here,
你实际上可以将Swift字符串传递给一个采用UnsafePointer< UInt8>的函数.
直:
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) 不幸的是(据我所知)目前没有解决你的第二个问题.
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,_) in print(flags) },&context)SCNetworkReachabilityScheduleWithRunLoop(reachability,CFRunLoopMode.commonModes.rawValue)
更新Swift 3(Xcode 8):
总结以上是内存溢出为你收集整理的ios – 使用Swift的C API全部内容,希望文章能够帮你解决ios – 使用Swift的C API所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)