快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容)
导入 C 系统模块,调用简单的 POSIX/C API,并使用 Foundation 桥接(String/NSString、数组/字典)。了解 Objective-C 的 NSError** 如何转换为 Swift 的 throws 。
快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容) 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 3 节课。
互操作性概览
下面快速介绍互操作性:
- C:导入系统模块并调用 POSIX 辅助函数
- Foundation:String/NSArray/NSDictionary 桥接
- NSError → Swift 的抛出错误机制
C 导入与指针
Swift 可以直接调用许多C API。使用条件导入来确保可移植性,并使用 String(cString:) 转换 char*。
// Import the platform C module: Darwin (Apple) or Glibc (Linux)
#if canImport(Darwin)
import Darwin
#else
import Glibc
#endif
// Use C getenv (returns C pointer) and strlen
if let cPtr = getenv("USER") {
let name = String(cString: cPtr) // bridge C char* -> Swift String
print("Hello,", name)
} else {
print("Hello, anonymous")
}
// strlen works on C strings:
let cString: [CChar] = Array("swift".utf8).map { CChar($0) } + [0]
let len = strlen(cString)
print("strlen(s) =", len)C 随机数示例
调用平台提供的 C 函数(例如 Apple 上的 arc4random_uniform、Linux 上的 random())。让示例保持简短且可移植。
#if canImport(Darwin)
import Darwin
let r = arc4random_uniform(100) // 0..99
print("random:", r)
#else
import Glibc
let r = UInt32(random() % 100) // 0..99 (demo)
print("random:", r)
#endifFoundation 桥接
Foundation 类型可以自然桥接:String⇄NSString、[Any]⇄NSArray、[Key:Any]⇄NSDictionary。
import Foundation
// String ↔ NSString bridge is seamless
let swiftString: String = "hello"
let ns: NSString = swiftString as NSString
print(ns.uppercased) // via NSString API
let back: String = ns as String
print(back + " world")
// NSArray / NSDictionary bridge to Swift collections
let nsArray: NSArray = ["a", "b", "c"]
let swiftArray = nsArray as! [String]
print(swiftArray.joined(separator: ","))
let nsDict: NSDictionary = ["lang": "Swift", "year": 2014]
let swiftDict = nsDict as! [String: Any]
print(swiftDict["lang"] as? String ?? "-")NSError → 抛出错误
Objective-C 的 NSError** 参数会导入为抛出错误函数。使用 try/do-catch,无需手动处理指针。
import Foundation
// Many Obj-C methods that take NSError** are imported as throwing in Swift.
let fm = FileManager.default
// Create a temporary file, then remove it with "try".
let tmp = (NSTemporaryDirectory() as NSString).appendingPathComponent("demo.txt")
FileManager.default.createFile(atPath: tmp, contents: Data("hi".utf8), attributes: nil)
do {
try fm.removeItem(atPath: tmp) // was NSError** in Obj-C → throws in Swift
print("removed ok")
} catch {
print("remove failed:", error)
}将 Swift 暴露给 Obj-C
使用 @objc/@objcMembers 注解 Swift API(并继承自 NSObject),即可在混合代码库中让 Objective-C 访问它们。
import Foundation
@objcMembers
class Adder: NSObject {
dynamic var last: Int = 0
@objc func add(_ a: Int, _ b: Int) -> Int { last = a + b; return last }
}
let a = Adder()
print(a.add(2, 3)) // 5
print(a.last) // 5
// In mixed projects, Obj-C can call Adder via the generated Swift header.NSError 桥接答案
快速检查:NSError** API 会如何导入?
回顾
回顾:
- 导入 Darwin/Glibc 并调用简单的 C API。
- 使用 Foundation 桥接字符串和集合。
- Objective-C 的 NSError** 会映射为 Swift 的抛出错误机制。
常见问题解答
「快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容)」课时是免费的吗?
是的 — 「快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 3 节课。
「快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容)」这节课中我会学到什么?
导入 C 系统模块,调用简单的 POSIX/C API,并使用 Foundation 桥接(String/NSString、数组/字典)。了解 Objective-C 的 NSError** 如何转换为 Swift 的 throws 。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。
「快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Swift 脚本(swift shebang)与命令行工具
- 快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容)
- 使用 SPM 打包二进制文件