0Pricing
Swift Academy · บทเรียน

การทำงานร่วมกับ C/Obj-C โดยสรุป (ไม่เจาะจง iOS)

นำเข้าโมดูลระบบ C เรียกใช้ API POSIX/C อย่างง่าย และใช้บริดจ์ของ Foundation (String/NSString, อาร์เรย์/พจนานุกรม) ดูว่า NSError** ของ Objective-C กลายเป็น throws ของ Swift ได้อย่างไร

การทำงานร่วมกับ C/Obj-C โดยสรุป (ไม่เจาะจง iOS) เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

ภาพรวมการทำงานร่วมกัน

นี่คือภาพรวมอย่างรวดเร็วของการทำงานร่วมกัน:

  • ภาษาซี: นำเข้าโมดูลระบบและเรียกใช้ตัวช่วยของ POSIX
  • ฟาวน์เดชัน: การเชื่อมต่อชนิดสตริง อาร์เรย์ และพจนานุกรม
  • ข้อผิดพลาดของอ็อบเจกทีฟ-ซี → การโยนข้อผิดพลาดของสวิฟต์

การนำเข้าภาษาซีและพอยน์เตอร์

สวิฟต์สามารถเรียกใช้ API ของภาษาซีจำนวนมากได้โดยตรง ใช้การนำเข้าแบบมีเงื่อนไขเพื่อความสามารถในการพกพา และแปลง ตัวชี้อักขระด้วย String(cString:)

// 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)

ตัวอย่างการสุ่มด้วยภาษาซี

เรียกใช้ฟังก์ชันภาษาซีของแพลตฟอร์ม (เช่น ฟังก์ชันสุ่มจำนวนเต็มแบบสม่ำเสมอบนแอปเปิล และฟังก์ชันสุ่มบนลินุกซ์) ควรทำตัวอย่างให้เล็กและพกพาได้

#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

การเชื่อมต่อชนิดข้อมูลของฟาวน์เดชัน

ชนิดข้อมูลของฟาวน์เดชันเชื่อมต่อกันได้ตามธรรมชาติ: สตริง⇄สตริงของอ็อบเจกทีฟ-ซี, อาร์เรย์ของค่าใด ๆ⇄อาร์เรย์ของอ็อบเจกทีฟ-ซี, พจนานุกรม⇄พจนานุกรมของอ็อบเจกทีฟ-ซี

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 ?? "-")

ข้อผิดพลาดของอ็อบเจกทีฟ-ซีสู่การโยนข้อผิดพลาด

พารามิเตอร์ข้อผิดพลาดแบบตัวชี้คู่ของอ็อบเจกทีฟ-ซีนำเข้าเป็นการโยนข้อผิดพลาด ใช้ 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)
}

เปิดเผยสวิฟต์ให้อ็อบเจกทีฟ-ซี

ใส่คำกำกับ @objc/@objcMembers ให้ API ของสวิฟต์ (และสืบทอดจาก อ็อบเจกต์พื้นฐาน) เพื่อให้โค้ดเหล่านั้นมองเห็นได้จากอ็อบเจกทีฟ-ซีในโค้ดเบสแบบผสม

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.

คำตอบเรื่องการเชื่อมข้อผิดพลาดของอ็อบเจกทีฟ-ซี

ตรวจสอบสั้น ๆ: API ของ NSError** นำเข้าอย่างไร

สรุปทบทวน

สรุปทบทวน:

  • นำเข้า ดาร์วิน/จีลิบซี และเรียกใช้ API ภาษาซีอย่างง่าย
  • ใช้การเชื่อมต่อของ ฟาวน์เดชันสำหรับสตริงและคอลเลกชัน
  • พารามิเตอร์ข้อผิดพลาดแบบตัวชี้คู่ของอ็อบเจกทีฟ-ซีจะแปลงเป็น การโยนข้อผิดพลาดของสวิฟต์

คำถามที่พบบ่อย

บทเรียน “การทำงานร่วมกับ C/Obj-C โดยสรุป (ไม่เจาะจง iOS)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การทำงานร่วมกับ C/Obj-C โดยสรุป (ไม่เจาะจง iOS)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การทำงานร่วมกับ C/Obj-C โดยสรุป (ไม่เจาะจง iOS)”

นำเข้าโมดูลระบบ C เรียกใช้ API POSIX/C อย่างง่าย และใช้บริดจ์ของ Foundation (String/NSString, อาร์เรย์/พจนานุกรม) ดูว่า NSError** ของ Objective-C กลายเป็น throws ของ Swift ได้อย่างไร คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน

บทเรียน “การทำงานร่วมกับ C/Obj-C โดยสรุป (ไม่เจาะจง iOS)” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สคริปต์ Swift (shebang ของ swift) และเครื่องมือบรรทัดคำสั่ง
  2. การทำงานร่วมกับ C/Obj-C โดยสรุป (ไม่เจาะจง iOS)
  3. การจัดแพ็กเกจไบนารีด้วย SPM
← กลับไปที่ Swift Academy