0Pricing
Swift Academy · 课时

快速了解 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)
#endif

Foundation 桥接

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Swift 脚本(swift shebang)与命令行工具
  2. 快速了解 C/Obj-C 互操作(不涉及 iOS 特定内容)
  3. 使用 SPM 打包二进制文件
← 返回 Swift Academy