在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,一经查实,立即删除!

相关文章

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;在不需要的时候自动清楚的变量的存储区。里面的变量通常…

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

电脑运行太慢&#xff0c;很多小伙伴第一想到的就是加个内存&#xff0c;没错&#xff0c;一般主板上预留了两个以上的内存插槽&#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;非 …

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

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

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

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

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级的玩…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题

最近在工作中遇到一个问题&#xff0c;用织梦搭建好的网站&#xff0c;在本地上测试没问题但是上传到正式服务器上就出问题了&#xff0c;在后台登陆的时候&#xff0c;验证码的图片老是显示不出来&#xff0c;后来查阅了相关资料才终于找到问题的根本原因&#xff0c;下面就分…

Python与C语言的区别是什么?

点击上方蓝字关注我&#xff0c;了解更多咨询Python与C语言的区别是什么?Python是由C语言实现&#xff0c;C语言是编译型语言&#xff0c;经过编译后生成机器码再运行&#xff0c;执行速度快不能跨平台&#xff0c;一般用于操作系统驱动等底层开发。Python是理解为解释型语言执…

C语言数据类型从计算机原理的角度是怎样看待的?

点击上方蓝字关注我&#xff0c;了解更多咨询初学C语言&#xff0c;首先要接触的就是数据类型了&#xff0c;这也是学习任何一门语言所必须经历的阶段。很多同学在学习的时候不理解数据类型&#xff0c;因为对计算机及原理知之甚少。所以&#xff0c;在学习数据类型之前&#x…

android module中获取 app_Android组件化架构 - 4. 动态创建

Android 组件化中使用动态创建的作用是解耦&#xff1b;1. 反射机制反射有两个作用&#xff1a;1.反编译&#xff1a;.class->.java;2.通过反射机制访问java对象中的属性&#xff0c;方法&#xff0c;构造器等&#xff1b;实现反射&#xff0c;实际上是得到Class对象2. 动态…

小白适用的C语言数据类型转换及转换规则

点击上方蓝字关注我&#xff0c;了解更多咨询1.不同类型数据间的混合运算与类型转换&#xff1a;①若参与运算量的类型不同&#xff0c;则先转换成同一类型&#xff0c;然后进行运算②转换按数据长度增加的方向进行&#xff0c;以保证精度不降低。如int型和long型运算时&#x…

jax-ws和jax-rs_带有JAX-RS和PrimeFaces的RESTful图表

jax-ws和jax-rs通常&#xff0c;利用图表提供数据的直观表示很有用。 PrimeFaces提供制图解决方案&#xff0c;可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果我们将PrimeFaces图表组件的使用与RESTful Web服务数据结合在一起&#xff0c;我们可以创建自定义图表…

udp 使用connect优点_nodejs源码分析第十九章 -- udp模块

udp不是面向连接的协议&#xff0c;所以使用上会比tcp简单&#xff0c;他和tcp一样&#xff0c;使用四元组来标记通信的双方&#xff08;单播的情况下&#xff09;。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程&#xff08;伪代码&#xff0…

C语言与Java的对比,你想好选谁了吗?

点击上方蓝字关注我&#xff0c;了解更多咨询很多同学纠结自己应该学C语言还是学Java&#xff0c;本篇文章带你细致了解C语言与Java的各方面的不同之处&#xff0c;让你能够更全面的把握编程语言&#xff01;1.Java与C语言各自的优势C语言是面向过程的语言&#xff0c;执行效率…

C语言:初始C语言

点击上方蓝字关注我&#xff0c;了解更多咨询什么是C语言为什么学习C语言&#xff1f;第一个C语言程序什么是C语言说到语言&#xff0c;可能会想到汉语&#xff0c;英语这些人与人之间交流的语言&#xff0c;语言是人与人之间沟通的桥梁&#xff0c;通过语言&#xff0c;我们得…