在Swift中使用C语言的指针

bc4e87a66e4560934439124b684a048f.png

点击上方蓝字关注我,了解更多咨询

952ecfdd22186afe4729316cb708cc83.png

Objective-C和C语言经常需要使用到指针。Swift中的数据类型由于良好的设计,使其可以和基于指针的C语言API无缝混用。同时 Swift也可以自动处理大多数将指针作为参数的情况。在这篇文章里,我们可以看到在Swift语言中如何将变量、数组、字符串当做C语言中的指针参数来 使用。

将输入输出参数作为指针参数

C 和 Objective-C 不支持多类型的返回值。所以 Cocoa API 就使用指针作为函数的输入输出参数,以用来传递多类型的数据。Swift允许使用指针参数进行类似 inout 参数的处理,所以你可以使用 & 语法将一个 var 变量的引用作为指针参数进行传递。比如说,UIColor的getRed(_:green:blue:alpha:)  方法,使用4个 CGFloat*  指针用来接收颜色的组成元素。我们可以使用 & 将这几个颜色组成部分装配在本地变量中。

var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0  
color.getRed(&r, green: &g, blue: &b, alpha: &a)

另外一个常见的情况出现在 Cocoa NSError 类的使用中。很多方法都使用一个 NSError** 参数来保存异常信息。比如说,我们可以通过 NSFileManager 类的 contentsOfDirectoryAtPath(_:error:)  方法,罗列出指定目录中的信息,一旦出现疑似异常信息,就将其保存在 NSError?  类型的变量中。

var maybeError: NSError?  
if let contents = NSFileManager.defaultManager()  .contentsOfDirectoryAtPath("/usr/bin", error: &maybeError) {  // Work with the directory contents  
} else if let error = maybeError {  // Handle the error  
}

为安全起见,Swift 要求在使用 & 传值时,变量必须是已经被初始化的。这是因为 Swift 无法知道也无法判断在操作指针之前,该指针是否确实在内存有指向的地址。

将数组作为指针参数

在C语言中,指针与数组是水乳交融,纠缠不清的。那么为了在 Swift 中能无缝的使用C语言中基于数组的一些API,Swift 允许将 Array 作为指针参数。一个不可变数组的值可以作为一个 const 指针参数直接传递,可变数组可以使用 & 作为一个非 const 指针参数进行传递,就 inout 参数一样。比如,我们使用 Accelerate 框架中的 vDSP_vadd 函数对数组 a 和数组 b 进行相加,将结果写入 result 数组:

import Accelerate let a: [Float] = [1, 2, 3, 4] 
let b: [Float] = [0.5, 0.25, 0.125, 0.0625] 
var result: [Float] = [0, 0, 0, 0] vDSP_vadd(a, 1, b, 1, &result, 1, 4) // result now contains [1.5, 2.25, 3.125, 4.0625]

将字符串作为指针参数

C语言中,传递字符串的主要方式是通过 const char* 指针。在Swift中,String 也可以被用作 const char* 指针,用它可以向函数传递空字符串或UTF-8编码的字符串。比如,我们可以在标准的C语言和POSIX的库函数中直接使用字符串作为参数传递:

复制

puts("Hello from libc") 
let fd = open("/tmp/scratch.txt", O_WRONLY|O_CREAT, 0o666) if fd < 0 { perror("could not open /tmp/scratch.txt") 
} else { let text = "Hello World" write(fd, text, strlen(text)) close(fd) 
}

指针参数转换的安全性

Swift一直在努力让我们可以方便的、无缝的使用C语言中的指针,因为在Cocoa中已经使用的非常普遍了。虽然Swift是一个类型安全的 语言,对指针参数的转换的安全性也有保障,但是相比Swift原生的其他代码来说,还是存在着一定的不安全性。所以我们在使用时要格外小心。比如说:

1.如果调用者在指针返回之后保存了指针指向的对象,那么再去使用这个对象时是不安全的。这些被转换的指针参数只能在调用过程中或者发送消息过 程中保证其有效性。即时你使用相同的变量、数组或者字符串作为多指针参数进行传递,你每次接收到的指针都是不同的。除非是全局或者静态变量。你可以安全的 使用全局或静态变量的指针的参数,比如KVO上下文参数。

2.当将数组或字符串作为指针参数传递时,Swift不会检查其边界值。在C语言中,数组和字符串的大小是不能增长的,所以当你将数组或字符串作为指针参数传递时,要确保它们有足够的大小,或者适合当前场景的大小。

如果你使用的基于指针的API不在这篇指导内,或者你需要重写接收指针参数的Cocoa方法,那么你可以直接使用Swift原始内存中的不安全的指针。我们会在以后的文章中介绍更多Swift的特性。

0fcf42d8fcd648f34f11a3ce5e01810a.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

d2156f49465666d379f99b925687964a.png

0ca498e2fc85c37be891ae939d961a86.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机四级数据库分值分布,计算机四级数据库工程师考试成绩查询注意事项

计算机四级数据库工程师考试成绩查询注意事项为帮助广大考生更好的了解有关计算机四级数据库工程师考试的相关信息&#xff0c;唯学小编特整理了计算机四级数据库工程师考试成绩查询注意事项&#xff0c;望考生能够认真查看。同时唯学小编特别提醒想要参加数据库工程师考试的考…

android 音频合成_【Android工具】用手机测量噪声的工具软件,噪声仪分贝计,量化噪声声音工具...

今天分享一个通过手机麦克风测量环境噪声的工具——声级计(噪声仪)。本来是要分享另一款的&#xff0c;但下载下来的是xapk的安装包&#xff0c;太麻烦了&#xff0c;功能差不多&#xff0c;大家就先用这款吧&#xff0c;有条件的朋友可以去play自己下载。软件名称&#xff1a;…

cassandra_Apache Cassandra和低延迟应用程序

cassandra介绍 多年来&#xff0c; Grid Dynamics拥有许多与NoSQL相关的项目&#xff0c;尤其是Apache Cassandra。 在这篇文章中&#xff0c;我们要讨论一个给我们带来挑战的项目&#xff0c;而我们在该项目中试图回答的问题今天也仍然适用。 数字营销和在线广告在2012年很受…

浅析五种C语言内存分配的方法及区别

点击上方蓝字关注我&#xff0c;了解更多咨询在C语言中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清楚的变量的存储区。里面的变量通常…

认识计算机听课记录20篇,【中学信息技术听课记录】 信息技术听课记录15篇及评析_初中信息技术听课记录_高中信息技术听课记录20篇_东城教研...

中学信息技术听课记录关于中学信息技术听课记录&#xff0c;东城教研小编了解到&#xff1a;听课记录表(一)实习学校&#xff1a;_xxx九年制学校__ 实践基地任课教师:xxx 班 级 八、一 时 间 2014.12.22 授课人 xxx 授课题目 软件的下载与安装 类 型 新授 教学过程 内 容 说 明…

电脑装机完没有efi_电脑装机如何选内存?看完这篇就全懂了

电脑运行太慢&#xff0c;很多小伙伴第一想到的就是加个内存&#xff0c;没错&#xff0c;一般主板上预留了两个以上的内存插槽&#xff0c;加内存是升级电脑最划算的一个硬件升级&#xff0c;其次&#xff0c;可能是加个固态硬盘来提速。今天电脑学习小编教你如何选择适合自己…

数据库 ogm_带有Hibernate OGM的NoSQL –第二部分:查询数据

数据库 ogmHibernate OGM的第一个最终版本发布于 1月底&#xff0c;团队一直在忙于制作一系列教程式博客&#xff0c;使您有机会轻松地从Hibernate OGM重新开始。 第一部分是关于设置和保留您的第一个实体 。 在第二部分中&#xff0c;您将学习如何查询数据。 Hibernate OGM将使…

计算机网络技术教法改革方案,计算机网络技术专业教学模式改革探索

龙源期刊网 http://doc.wendoc.com计算机网络技术专业教学模式改革探索作者&#xff1a;魏学宏来源&#xff1a;《职业中旬》2014年第12期摘要&#xff1a;中职教育是培养应用型技术人才的教育。为实现培养目标&#xff0c;推动教学方法改革&#xff0c;笔者在计算机网络技术专…

osgi:install_OSGi服务测试助手:ServiceCollector

osgi:installOSGi服务对于基于松散耦合组件的系统开发非常有用。 但是&#xff0c;松散的耦合可能使得难以识别与悬挂服务引用有关的问题。 因此&#xff0c;我们通常运行集成测试以确保运行时服务组件的可用性。 为了减少此类测试所需的样板&#xff0c;我编写了一个简单的实…

塞尔达盾反机器人_微软商店惊现《塞尔达传说:旷野之息》!任天堂暗示《喷射战士3》?| Jump简报...

首先还是祝各位Jumper圣诞快乐&#xff01;业界新闻1. 各大厂商新年寄语&#xff0c;表明未来动向Fami通收到了54家日厂的新年贺卡&#xff0c;其中表明了相当多的新游戏和企划&#xff0c;具体如下&#xff1a;Atlus &#xff1a;《真女神转生V》和《PROJECT Re FANTASY》正在…

PHP 社区拒绝在俄乌冲突中“站队”

点击上方蓝字关注我&#xff0c;了解更多咨询几天前&#xff0c;PHP 社区邮件讨论列表出现了一封“申请援助乌克兰”的邮件&#xff0c;该邮件由非 PHP 开发者发起&#xff0c;目的在于呼吁 PHP 社区火速参与俄乌冲突...邮件机翻译文如下&#xff1a;有意思的是&#xff0c;非 …

放置奇兵最新服务器,放置奇兵开服表

游戏简介&#xff1a;《放置奇兵》是一款全球顶级奇幻RPG手游&#xff0c;派出你的英雄小队&#xff0c;出 发&#xff0c;从碧绿葱葱的萨拉森林到神圣威严的至高天&#xff0c;同数百万玩家一同踏上魔幻旅程&#xff0c;带领你的英雄小队深入古老的废墟&#xff0c;对抗邪恶的…

如何把svn代码拉下来,Maven - 从SVN拉取代码

I am migrating J2ee Project from Ant to Maven,One of The ant tasks is to pull existing source from SVN RepositoryCompile it, and add its jar to my current build as JarIs it possible to do the get the source and compile it in Maven?Thank you!解决方案Yes, i…

jvm内存 大于 xmx_为什么我的JVM访问的内存少于通过-Xmx指定的内存?

jvm内存 大于 xmx“嘿&#xff0c;你能来看看奇怪的东西吗&#xff1f;” 这就是我开始研究支持案例的方式&#xff0c;将我引向了这篇博客文章。 眼前的具体问题与报告可用内存数量不同的不同工具有关。 简而言之&#xff0c;一位工程师正在研究特定应用程序的过多内存使用情…

为什么说PHP是很糟糕的,也是很好的编程语言

点击上方蓝字关注我&#xff0c;了解更多咨询PHP 又是一门相当奇怪的编程语言。当人们抱怨这门语言“很糟糕”时&#xff0c;他们并没有说错。这门语言确实有很多不好的地方。搁在以前&#xff0c;这门语言还有更多糟糕的问题。嘲笑 PHP 的博文《全面解析 PHP 的糟糕设计》(PHP…

中南大学计算机博士读几年,法学院2019年上半年毕业博士生须知

为保证2019年上半年博士生毕业工作顺利开展&#xff0c;根据我校博士生答辩管理的相关文件&#xff0c;现将有关事项通知如下&#xff0c;请遵照执行。1.毕业申请:拟毕业研究生于3月15日前登录“中南大学研究生教育管理信息系统”(以下简称管理系统)&#xff0c;在管理系统个人…

1.0jpa 2.0_JPA 2.1:不同步的持久性上下文

1.0jpa 2.0JPA 2.1版带来了一种新的方式来处理持久性上下文与当前JTA事务以及资源管理器之间的同步。 术语资源管理器来自Java事务处理API &#xff0c;它表示操纵一个资源的组件&#xff08;例如&#xff0c;使用其JDBC驱动程序操纵的具体数据库&#xff09;。 默认情况下&…

vue 保存时清空iuput_vue清空input file

Coding源码学习第四部分&lpar;Masonry介绍与使用&lpar;三&rpar;&rpar;接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...python 线性回归示例说明:此文的第一部分参考了这里 用python进…

Objective-C学习中对 C语言的扩展

点击上方蓝字关注我&#xff0c;了解更多咨询Objective-C学习中对 C 的扩展是本文要介绍的内容&#xff0c;Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集&#xff0c;许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是…

神武4手游服务器维护,神武4手游 本周新手服限服开启 !

《神武4》手游新老玩家互动福利新手服即将于本周在天下无双、二〇二〇、见龙在田限服开启&#xff0c;通过“老带新”模式&#xff0c;助力萌新玩家快乐成长的同时&#xff0c;也为老玩家送出更多福利好礼。【《神武4》手游新手服限服开启 】服务器等级≥65且自身等级≥69级的玩…