为了手头上的一个项目,我需要使用 CommonCrypto 库中的 HMAC 函数.虽然苹果在 swift 中已经提供了许多系统库,但是 CommonCrypto 不在其中.庆幸的是,要使用这个库并不怎么费事,只需要做一点额外的工作.
开始访问库
在使用库之前,我们需要通知 Swift编译器.要完成这个过程,我们有两种方式.它们都能在示例工程中正常运行,但是你应该根据你代码的用途来选择具体的方式.好消息是,你随便使用那种方式,然后如果在后面需要另一种的话,要切换那是相当简单.

Objective-c 桥接头文件

最简单的访问一个库的方式是使用 OC 桥接头文件.因为 OC 是 C 的超集.所以这个桥接头文件也能够让你访问纯 C 库.如果你的 swift 工程里面没有桥接头文件,那么自己创建一个,这个步骤简单的要死.
右键你的工程,然后添加一个 OC 文件,随便起个名字(一会我们就删掉这个文件).

一旦你建立好这个文件,Xcode 将会询问你是否需要配置一个 OC 桥接头文件,当然选择”是”.然后删掉你刚刚建立的OC 文件(不是头文件…).这个头文件将会被命名成 项目名- Birdging-Header.h.打开这个文件,并且导入你需要的 C 库.

需要注意的是,许多库需要额外的链接器设置,例如,在其它链接器标识中的-lfoo会告诉链接器去链接到 libfoo. 请在你的 Xcode 项目的 Buid settings 里面设置好.

模块图

虽然桥接头文件的方式是如此的简单易行,但是它却有个很关键的局限–你不能在一个framework类型的工程中使用它.所以,为了弥补这个缺陷,你可以使用”模块”
要使用”模块”,在你的项目目录(目录名是你的项目名称)下来创建一个目录,把这个目录命名为你想使用的库的名字.我是在命令行,没有 Xcode 的保护,然后命名它为 ConmmonCrypto. 在这个目录中,创建一个 module.map 文件,这个文件里面囊括了库的一些设置.对于我的 CommonCrypto,module.map 是这个样子的.

module CommonCrypto [system] {


header "/usr/include/CommonCrypto/CommonCrypto.h"

export *
}

现在添加这个新模块到你的 project setting 中的swift compiler条目下的 Import Paths-Search Path.使用 SRCROOT(: {SRCROOT}/CommonCrypto))来确保无论你在哪检出项目,这个模块都能正常工作(相对路径) .
现在仅仅是确保让你能够把你的模块导入到 swift 文件中.注意,你自己用这种方式建立的所有框架都必须这样导入到你的项目中.

使用 C 函数

一旦你告知了 swift 的编译器关于你将怎么引用 C 库的信息,那么你就可以直接在 swift 代码中直接使用他们了.这个过程中,牵涉到的只是搞清楚哪个 swift 类型匹配哪个 C 类型,而这个过程被 Xcode 的自动补全搞的非常简单,它能帮我们完成大多数重要的内容.这是一个SHA1 HMAC的例子:

func hmac_sha1(data: NSData,key: NSData) -> (NSData?) { 
var result = NSMutableData(length: Int(CC_SHA1_DIGEST_LENGTH))
if (result != nil) {
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1),
key.bytes,size_t(key.length),
data.bytes,size_t(data.length),
result!.mutableBytes)
}
return result
}

如果你想搞明白对 CCHmac 的调用是如何工作的,你可以查阅这里

这个是函数原型:
CCHmac(CCHmacAlgorithm algorithm, const void *key, size_t keyLength,
const void data, size_t dataLength, void macOut);

英文原文地址:http://spin.atomicobject.com/2015/02/23/c-libraries-swift/

开始使用 swift 的 c语言 库的更多相关文章

  1. ios – -ObjC标志能否有选择地应用于静态库?

    TL;DR如何使-ObjC链接器标志针对特定的静态库,而不是我链接的所有静态库,以避免未使用的目标文件与我的应用程序链接?

  2. ios – Xcode 7.1 PrototypeTools链接器错误(仅限模拟器)

    我正在尝试使用Xcode7.1在iOS模拟器中运行我的应用程序,但我收到链接器错误.这是错误:clang:错误:链接器命令失败,退出代码为1这似乎是一个新问题,因为我在升级到新的Xcode之前没有它.我在Google上搜索过,但是这个问题几乎没有相关主题.有趣的是,该应用程序在设备上运行良好.我已经尝试重置模拟器并再次清洁/建造,但两者都没有奏效.有没有其他人遇到过这个问题,你能提供什么建议吗?

  3. 通过cocoapods安装适用于iOS的Google Maps SDK会导致链接器错误

    我正在尝试使用cocoapods安装适用于iOS版本1.3.0的GoogleMapsSDK.实际上安装过程很成功,但是当我尝试使用框架时,app构建过程会返回链接器错误,例如:由于某种原因,链接器无法找到框架.我的cocoapods版本是0.20.1.XCode4.6.2.除了谷歌地图SDK,我的项目还有另外两个通过cocoapods添加的库.这是我的Podfile:提前致谢.解决方法您应该看到一个文件“Pods.xcconfig”,其中包含pod正在使用的框架.将应用程序的目标配置更改为基于CocoaP

  4. ios – 不同作用域中相同命名常量的链接器错误

    我有一个名为“ID_KEY”的常量,它在3个单独的.m文件的顶部声明,其中没有包含其他文件.声明如下:而其他两个类也是如此.但是我收到一个链接器错误抱怨同名的多个定义.我的问题是为什么链接器抱怨这个呢?

  5. ios – AudioKit 4.1 Mach-O链接器错误Swift 4

    我正在尝试使用AudioKit4.1来学习基础教程.我首先在项目中导入了AudioKit框架,如下图所示.导入AudioKit框架后,我在ViewController中添加了几行代码,如下所示:运行代码后,我得到59错误,如下图所示.你是如何解决的?解决方法从版本4.1开始,AudioKit现在作为静态框架提供.由于所有内部C代码,它取决于标准C库.这种依赖关系曾经由动态链接器自动解决,但不再是.使这些错误消失的最简单方法是在Xcode中的目标设置中添加-lstdc链接器标志.

  6. ios – 从Swift重写一个Obj-C类方法,返回NSArray

    .要在Swift子类中指定可选或具体值,请使用Objective-Cnullability说明符:exampleMethod;桥接以覆盖类funcexampleMethod()–>[AnyObject]exampleMethod;桥接以覆盖类funcexampleMethod()–>[AnyObject]?exampleMethod;和exampleMethod;具有相同的行为并桥接到隐式解包的可选项.

  7. ios – apple mach-o链接器错误链接器命令失败,退出代码为1(使用-v查看调用)

    2我正在使用带有核心数据的ObjectiveC,我收到一个错误:AppleMach-O链接器错误,链接器命令失败,退出代码为1解决方法您需要打开详细说明.

  8. 开始使用 swift 的 c语言 库

    为了手头上的一个项目,我需要使用CommonCrypto库中的HMAC函数.虽然苹果在swift中已经提供了许多系统库,但是CommonCrypto不在其中.庆幸的是,要使用这个库并不怎么费事,只需要做一点额外的工作.开始访问库在使用库之前,我们需要通知Swift编译器.要完成这个过程,我们有两种方式.它们都能在示例工程中正常运行,但是你应该根据你代码的用途来选择具体的方式.好消息是,你随便使用那

  9. Swift教程10-运算符与C语言的不同

    =,==这些运算符和其他语言的类似,是比较前后两个值是否相等,或者大小关系比较字符串内容是否相等,使用==即可但是Swift新增了===恒等于,是针对于引用类型,如两个对象之间是否是同一个对象与之对应的是!运算符示例Swift新增的??

  10. Swift 体会

    前言Swift体会我不算是一个果粉,但是我很喜欢苹果的产品,甚至可以说是狂热。运行速度从苹果官方所给出的数据来看,Objective-C比Python快2.8倍,而Swift比Python快3.9倍,可见苹果在Swift上下了大量的功夫进行优化。开发环境Swift语言的开发环境是苹果公司提供的集成开发环境Xcode,可以用来开发iOS应用、iOS游戏、OSX窗体程序、OSX游戏、OSX命令行程序,读者可以直接从AppStore中搜索并下载。由于Swift是苹果的产品,所以目前只支持苹果的系统。

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部