HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 使用Swift的C API大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试跟踪网络状态.我浏览了 FXReachability代码.具体是以下方法.

- (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函数或闭包的方法.
请注意0​​7002的文档
显示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,请注明来意。