Swift:你如何使用链接库中的Objective-C函数?

时间:2014-09-30 22:17:02

标签: ios objective-c swift

背景

我是iOS开发的新手,为了学习而玩Swift。作为一个小小的挑战,我试图获取设备当前连接的网络的SSID。

这是Stack上使用Objective-C的完全覆盖的基础:iPhone get SSID without private library,例如......但是Objective-C / Swift舞蹈给我带来了一些概念上的挑战。

具体来说,建议的解决方案(在上面链接的帖子中讨论)是调用函数CNCopyCurrentNetworkInfo() - 但是,根据Apple's documentation,此函数在Swift中不可用。

到目前为止

我已将(我认为正确)SystemConfiguration.framework添加到项目的链接框架和库中。我还使用import SystemConfiguration将其带入了View Controller。

问题

  1. 我是否需要 使用import SystemConfiguration,或者由于将框架包含在我的项目中而已经完成了?
  2. 是否有其他/更好的方式来包含SystemConfiguration库?

  3. 最重要的:如果导入了所需的库,您是否从库中调用Objective-C函数?

  4. 谢谢!

2 个答案:

答案 0 :(得分:6)

我知道这不是直接回答你的问题,但它是你问题的答案。 在你的情况下,你可以迅速完成所有事情。

导入库后

import SystemConfiguration.CaptiveNetwork

您可以立即致电:

CNCopySupportedInterfaces()

它会起作用。 在Xcode 6.3.2中确认。

答案 1 :(得分:2)

Apple的互操作性书(来自Understanding the Swift Import Process):

  

任何可作为模块访问的Objective-C框架(或C库)   可以直接导入Swift。这包括所有的   Objective-C系统框架 - 例如Foundation,UIKit和   SpriteKit以及随系统提供的通用C库。

关于您的具体问题:

  1. 情况恰恰相反:您不需要手动包含Apple的框架。给定有效的import声明(例如您的import SystemConfiguration),Xcode会自动为您提供这些声明,甚至 - 或者更确切地说: - 在操场上!

  2. ...同上

  3. 鉴于上述导入语句,SystemConfiguration确实已导入,因为您可以调用其函数(例如SCCopyLastError() // --> __NSCFError)并访问其常量(例如kCFErrorDomainSystemConfiguration // --> com.apple.SystemConfiguration)。遗憾的是,CaptiveNetwork似乎未随其导入(例如CNCopySupportedInterfaces() // --> Use of unresolved identifier)。

  4. 但是,您应该可以在Objective C端使用此框架,只需从Swift调用自己的包装器函数即可。您只需要记住将它们包含在桥接标题中列出的导入中(有关桥接标题的更多信息,请参阅Swift and Objective-C in the Same Project)。