开始使用 swift 的 c语言 库

为了手头上的一个项目,我需要使用 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/

时间: 2024-10-11 09:02:37

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

Swift 1.1语言第7章 函数和闭包

Swift 1.1语言第7章  函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护.为 了解决这个问题,人们提出了函数这一概念.使用函数可以将特定功能的代码封装,然后在很多的地方进行使用.本章将会讲解函数和闭包的相关内容.本文选自<Swift 1.1语言快速入门> 7.1  函数介绍 函数是执行特定任务的代码块.使用函数会给开发这带来很多的好处.以下总结了其中两点. 1.结构鲜明,便于理解 如果在一

swift介绍和语言概述

Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,这里引用The Swift Programming Language的原话:  Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective-C, without the constraints of C compatibility. Swift adopts safe programm

Swift 1.1语言函数参数的特殊情况本地参数名外部参数名

Swift 1.1语言函数参数的特殊情况本地参数名外部参数名 7.4  函数参数的特殊情况 声明定义有参函数时,为函数的每一个参数都定义了参数名称.根据参数名定义的形式不同,函数参数包括本地参数和外部参数名两种本文选自swift入门很简单. 7.4.1  本地参数名 本地参数名就是定义函数名时,在参数列表中所写的参数名,它只可以在函数主体内使用.如以下的一个代码片段,它定义了一个函数名为fun的函数,在此函数的参数列表中定义的就是本地参数名文选自swift入门很简单. func fun(star

ubuntu下使用Tesseract-ocr(编译、安装、使用、训练新的语言库)

本文前半部分是来自http://www.qisanfen.com/?p=185的一篇文章,主要讲了安装.训练的大致流程,注意如果需要训练语言库需要把所需要的库安装完整 后半部分大致是官方wiki的翻译版本 如果只安装,不训练,可以看我的另一篇比较简洁的文章http://blog.csdn.net/yimingsilence/article/details/51276138 关于训练的具体细节可以查看官方wiki : https://github.com/tesseract-ocr/tessera

DDL 数据库定义语言--库创建/修改/删除--表的创建/修改/删除/复制

/*进阶 11 DDL 数据库定义语言 库和表的管理 一:库的管理:创建/修改/删除 二:表的管理:创建/修改/删除 创建: CREATE DATABASE [IF NOT EXISTS] 库名; 修改: alter 删除: DROP DATABASE [IF EXISTS] 库名; */ #一 : 库的管理 #1 库的创建 CREATE DATABASE books; CREATE DATABASE IF NOT EXISTS books; #2/库的修改 #库名的修改,需要停止服务器,然后修

Go语言库系列之aurora

背景介绍 今天跟大家推荐一款可以给终端输出上色的工具--aurora. 极速上手 准备工作 初始化项目 go mod init aurora 演示项目结构 . ├── go.mod ├── go.sum └── main.go 安装aurora包 go get -u github.com/logrusorgru/aurora 代码演示 首先引入aurora库 import . "github.com/logrusorgru/aurora" 输出一个品红颜色的内容,Magenta是以颜色

【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展

Swift是一种新的编程语言,用于编写 iOS 和 OS X 应用.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣.我们的腾讯Bugly移动开发者沙龙第二期就是围绕这一主题展开的,很多同学表示听的不够过瘾,因此小编特意邀请分享者将精华整理成文字,来于大家分享. 首先我们考察一下Swift究竟是一个什么样的变成语言.在2014年苹果的WWDC(世界开发者大会)上,Swift首次亮

Swift项目引入第三方库的方法

以下,将创建一个Swift项目,然后引入3个库: Snappy 简化autolayout代码的库 Alamofire HTTP网络库,AFNetworking作者写的 SDWebImage 图片加载,objc项目,通过头文件bridge方式供swift使用 其中,前两个是Swift的库,SDWebImage是Objc的库. 源代码见:https://github.com/MarshalW/SwiftWith3rdLibDemo 项目跑起来是这个样子: 做下面步骤之前,需要让自己的项目是git项目

iOS开发:在Swift中调用oc库

先列举这个工程中用到的oc源码库: MBProgressHUD:半透明提示器,Loading动画等 SDWebImage:图片下载和缓存的库 MJRefresh: 下拉刷新,上拉加载 Alamofire.xcodeproj和SwiftyJSON.xcodeproj是Swift的库,这篇博客主要记录调用上面4个oc的库. 第一步:将oc的源码库拖入到我们的projec,如下图. 第二步:新建一个头文件,用于引用oc的库.如下图,选择 object library 中的 头文件,拖拽到project