Swift 字符串文字赋值给 C 变量

2023-12-09

在 Swift 中,当调用 C 函数时,Swift 字符串作为参数传递时会自动强制转换为 CString。但是,在填写 C 结构体或全局变量时,我没有得到相同的行为。

strlen(swiftString)                     //Works!
CGlobalStruct.stringPtr = swiftString   //Doesn't work!

首先,为什么当它们都是“const *char”时它们的行为不同。其次,填写 C 结构体最简洁的方法是什么?


A Swift String可以作为参数传递给函数 AUnsafePointer<Int8>范围。编译器生成 Swift 字符串的临时表示 作为 NUL 终止的序列char并传递一个指针到 该函数的 C 字符串。表示形式和指针是仅在函数调用期间有效。这就是发生在

strlen(swiftString)   

当分配一个全局C字符串指针时,你必须采取 考虑此指针的生命周期。一种可能性是

let swiftString = "Hello world"

swiftString.withCString {
    CGlobalStruct.stringPtr = $0

    // Pointer valid inside this closure ...
}
// Pointer not valid anymore ...

其中指向 C 字符串表示形式的指针被传递给闭包。 该指针(仅)在闭包执行期间有效。

为了延长使用寿命,您可以allocate内存中的 C 字符串, 但最终你有责任释放该内存:

guard let cStringPtr = strdup(swiftString) else {
    fatalError("strdup failed")
}
CGlobalStruct.stringPtr = UnsafePointer(cStringPtr)

// ...

free(cStringPtr)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 字符串文字赋值给 C 变量 的相关文章

  • 来自 IOS Xcode 的 Azure 推送通知错误

    我觉得我是世界上第一个尝试让 iOS 快速与 Azure 配合使用的人 但没有太多帮助 我跟着这个创建 iOS 应用程序 https azure microsoft com en us documentation articles app
  • 在 Swift 中解码 JSON Web 令牌

    尝试在 Swift 中解码 JWT 有效负载 但遇到了很大的困难 static func decodePayload tokenstr String splitting JWT to extract payload let arr spli
  • 使用 swift 自动滚动 UITextView (IOS 应用程序)

    我似乎无法找到自动滚动的正确解决方案UITextView using Swift 对于我的应用程序 我从 BT 接收持续数据 并且我正在更新它UITextView 然而 当UITextView将到达最新更新的行 我将不得不手动滚动 我想要实
  • 如何在 Swift 4 中传递 Encodable 或 Decodable 作为参数?

    我正在学习 JSONParsing 我遵循了教程 得到的是这样的 guard let url URL string http localhost test api public api register else return var re
  • iOS 应用程序在 segue 处崩溃(断点发生在 func prepareForSegue 处)

    更新 我发现 仅通过阅读代码来调试是非常困难的 特别是在这样的情况下 https www dropbox com s ty3clsvgednzevj LoaferMap 20for 20iPhone 20copy 202 zip dl 0
  • Swift 中的运行时错误处理

    我完全知道 Swift 没有 try catch 机制来捕获异常 好吧 Swift 2 0 现在支持它们 我还了解到 许多 API 方法都会返回一个 NSError 如果出现问题 该错误对象将被填充为错误对象 所以请不要向我指出这个问题 S
  • for循环中的范围是什么类型?

    当我们写下以下内容时 for i in 1 10 do stuff 我想知道什么类型有范围1 10在函数调用中使用它 例如 myFunc 1 10 如果在定义后放置断点let range 1 lt 10 你会发现它实际上不是一个Range结
  • Swift 类型推断和类型检查问题

    我不是在寻找如何正确执行此操作的答案 而是在寻找为什么会发生这种情况的答案 这是代码 func isInt param AnyObject if let value param as Int print value else print N
  • 如何使用 Swift 4 将字符串拆分为英语和非英语?

    我有一个包含英语和阿拉伯语的字符串 我正在使用 API 这就是为什么我无法在其中设置指标的原因 我想要得到的是 阿拉伯语和英语分成两部分 这是一个示例字符串 Bismika rabbee wadaAAtu janbee wabika arf
  • Swift:将字符串转换为十六进制颜色代码

    我已经从数据库生成了用户 ID 格式类似于 XzSYoKJaqKYREkdB2dgwt0fLOPP2 我想用它来创建 UIColor 我找到了几个解决方案 https github com yeahdongcn UIColor Hex Sw
  • 在 Swift 中向 UIButton 添加字符串属性

    如何将字符串属性与UIButton在斯威夫特 我不希望该字符串显示为按钮文本 而只是将其作为标识符或键分配给按钮 这是我到目前为止所拥有的 func createAnswerButtons var index Int for index 0
  • 在 Swift 中寻找“退出”等价物[重复]

    这个问题在这里已经有答案了 我尝试把exit 0 在一个小型测试 命令行 程序中 Xcode 给出了一条错误消息 指出Use of unresolved identifier exit 这让我很困惑 因为这个问题 https stackov
  • 如何将渐变应用于 iOS Swift 应用程序的背景视图

    我正在尝试应用渐变作为视图 故事板的主视图 的背景颜色 代码运行 但没有任何变化 我正在使用 xCode Beta 2 和 Swift 这是代码 class Colors let colorTop UIColor red 192 0 255
  • 在 Swift 中获取 UIImage 的主颜色

    我正在尝试在 Swift 中获取 UIImage 的主颜色 并尝试移植这段代码 https stackoverflow com questions 13694618 objective c getting least used and mo
  • 如何从 GCD (DispatchQueue) 转换为 Swift async/await?

    我正在关注斯坦福大学的 CS193p 开发 iOS 应用程序在线课程 它使用 Grand Central Dispatch GCD API 来演示多线程 但他们指出 自 WWDC 2021 起 GCD 已大部分被 Swift 新的内置异步
  • Firestore 更新后仅获取文档一次

    我有一个 tableView 它从 Firestore 集合中获取所有文档 并且我只想在用户刷新 tableView 后将最后一个文档添加到 Firestore 时获取一次 然后我想删除侦听器 以便当用户刷新 tableView 时仅获取文
  • SwiftUI 列表与右侧的部分索引?

    是否可以有一个在右侧有索引的列表 就像下面 SwiftUI 中的示例一样 我在 SwiftUI 中做了这个 Contacts swift TestCalendar Created by Christopher Riner on 9 11 2
  • 确定 SceneKit 中 SKVideoNode 的视频大小/长宽比

    如何从 AVPlayer 获取视频的视频大小来设置节点的几何大小 例如 我有一个具有宽度和高度的 SCNPlane let planeGeo SCNPlane width 5 height 5 所以现在我实例化我的视频播放器 let vid
  • UIButton的高亮状态由什么控制事件开始和结束

    我正在创建类似钢琴的视图UIButton作为钢琴键 什么UIControlEvents当按钮获得和失去突出显示状态时 我应该监听以获得回调吗 我试图创建子类UIButton并添加属性观察者highlighted并且运行良好 然而 有时我需要
  • Swift:使具有相同“形状”的两种类型符合通用协议

    我有两种不同的类型 它们代表相同的数据 并且具有完全相同的 形状 这两种不同的类型是代码生成的 我被迫处理它们 但是 我想让它们符合一个通用的协议 这样我就可以对这两种类型一视同仁 这是一个例子 假设这是我所坚持的两种代码生成类型 stru

随机推荐

  • 将图像存储到 sqlite 数据库中

    下面是我在 sqlite 数据库中存储图像的代码 当我用它来存储值时它可以工作 现在我尝试将图像存储在 sqlite 数据库中 我不知道我做错了什么 我已经搜索过 但无法得到我需要的答案 任何人都可以帮我解决他的代码 sqlite3 dat
  • UITableView 静态单元格作为子视图?

    使用 iOS 5 中的 Storyboard 我将 uitableview 添加到具有静态单元格的现有视图控制器中 但是当我运行该应用程序时 表格视图不会显示 视图上的其他所有内容都加载良好 如何在常规视图控制器上将带有静态单元格的 uit
  • 如何根据每个项目中显示的数据更改列表项目的背景颜色?

    我在 SQLite 中有一个订单列表 其状态各不相同 已分配 已加载 已交付 我希望每个订单在列表中显示时都有不同的颜色背景 到目前为止 我还没有找到一个好的方法来做到这一点 我发现了很多关于如何根据位置更改列表项的背景颜色的讨论 但没有一
  • 为什么 np.hypot 和 np.subtract.outer 与普通广播相比非常快,并且有更快的方法来计算距离矩阵吗?

    我有两大组二维点 需要计算距离矩阵 我需要它很快 所以我使用了 NumPy 广播 在计算距离矩阵的两种方法中 我不明白为什么一种方法比另一种方法更好 From here我得到了矛盾的结果 单元格 3 4 6 和 8 9 都计算距离矩阵 但
  • Java:在 Scanner.nextLine() 上使用默认值填充 Scanner;

    我正在编写一个运行循环并不断询问用户输入的java程序 然后程序用该字符串执行一系列操作 并请求另一个字符串并重复 问题是许多字符串非常相似 所以我想用循环中上次的输入填充提示 例如 如果用户输入如下值 Enter the SKU Numb
  • Prolog - 将数字合并为数字

    我想将数字列表合并为数字 1 2 3 gt 123 我的谓词 merge X X merge H T X merge T X1 X is X1 H 10 但现在我得到 1 2 3 gt 33 另一种方法是将到目前为止已处理的内容乘以十 但您
  • R:C 符号名称不在加载表中 - 与外部 .c 文件链接时出错

    我正在尝试使用日晷用于求解常微分方程组 ODE 的包 使用SUNDIALS 首先 我尝试运行手册中的示例 当 ODE 的右侧在 C 文件中描述时 Rsundials 可用于求解 ODE 首先 ODE 在 C 文件中进行描述 包中的示例程序
  • 比较 uint64_t 和 float 的数值等效性

    我正在编写一个协议 它使用RFC 7049作为其二进制表示 该标准规定 如果数字值等于相应的 64 位数字 则协议可以使用数字的 32 位浮点表示 转换不得导致精度损失 哪些 32 位浮点数可以大于 64 位整数并且在数值上与它们等价 正在
  • 卸载矩阵并释放内存

    我可以从文本文件加载矩阵 load mydata txt 问题是我的矩阵文件大约有 250Mb 经过几次这样的加载后 我没有内存来处理下一个文件 如何卸载它并释放资源以供进一步使用 Use clear or 清除变量 默认情况下 MATLA
  • 使用 libre office 创建的 Acrofield 不可填写代码,除非我编辑 pdf 一次

    我正在 Libre Office 中创建表单控件并将文档导出为 pdf 尝试使用 itextsharp 即 C 程序 设置控件 文本框 的文本只会清空该框 但是 如果我使用 acrobat reader 打开 pdf 并编辑框中的文本 则将
  • 将 C# 代码组织到不同的文件中

    我的主代码文件已经达到了大约一千行长并且变得难以管理 也就是说 我开始感到困惑 不知道在哪里可以找到一些东西 评论很好 但是东西太多了 我真的希望能够将我的代码组织到不同的文件中 每个文件都有自己的用途 当我编辑这些其他文件时 我希望在输入
  • 带有图像和标签的 Python GTK3 按钮

    我试图获取带有图像和标签的按钮 但没有成功 我可以有带有标签或图像的按钮 但不能两者兼而有之 这是我的代码部分 try pb Pixbuf new from file at size myimg jpg 100 100 except pb
  • 想了解为什么 switch_to_alert() 收到删除线以及如何修复

    我试图 接受 一个简单的模态警报 只有 确定 按钮的屏幕弹出窗口 但 driver switch to alert 中的 switch to alert 正在接收删除线 在 pycharm 上 我正在使用 OpenPyxl 的数据驱动测试脚
  • swig 没有匹配的重载函数

    我在使用 SWIG 将 C 代码包装在 PHP 中时遇到问题 我有一个 C 类 其方法声明如下 int hexDump string dmpstr bool space true const 我还将 std string i 包含在我的接口
  • 使用 LINQ 在 C# 中合并字典

    我有三本字典 比如 Dictionary
  • CoreData 中 NSDictionary 属性的更新未保存

    我在 CoreData 中创建了一个实体 其中包含作为 NSDictionary 实现的 Transformable 属性类型 NSDictionary 属性仅包含自定义类的值 自定义类的属性都是NSString类型 自定义类符合 NSCo
  • 将 JSON 对象反序列化为嵌套 C# 对象

    Edit 我想我应该提到我无法控制 JSON 并且我知道通常我的 C 对象应该与 JSON 匹配 我的问题不是 为什么这不反序列化 我知道为什么不是 我问是否有一种方法可以按照我要求的方式反序列化 JSON 我正在使用 Newtonsoft
  • 将 for 循环转换为向量(向量化)

    对于那些超级专家 我想知道您是否看到一种快速方法将以下 for 循环转换为更有效的单行向量计算 Define A size n 1 B size n m C size n 1 B 2 200 3 300 4 400 C 1 2 1 for
  • 以下用于添加到内存引用的字节说明符在 NASM 汇编器中起什么作用?

    下面的代码 section data Snippet db KANGAROO section text global start start mov ebx Snippet add byte ebx 32 将 BX 中的内存地址所指的数字加
  • Swift 字符串文字赋值给 C 变量

    在 Swift 中 当调用 C 函数时 Swift 字符串作为参数传递时会自动强制转换为 CString 但是 在填写 C 结构体或全局变量时 我没有得到相同的行为 strlen swiftString Works CGlobalStruc