Swift Academy · درس

لمحة عن التكامل بين C وObj-C (من دون تفاصيل iOS)

استورد وحدات نظام C، واستدعِ واجهات POSIX/C البسيطة، واستخدم جسور Foundation (String/NSString والمصفوفات والقواميس). تعرّف إلى كيفية تحوّل NSError** في Objective-C إلى throws في Swift.

الدرس 2 من 38 خطوة

لمحة عن التكامل بين C وObj-C (من دون تفاصيل iOS) درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 3 دروس في المجموع.

خريطة التوافقية

هذه جولة سريعة على التوافقية بين اللغات:

  • C: استورد وحدات النظام واستدعِ مساعدات POSIX
  • Foundation: جسور String/NSArray/NSDictionary
  • NSError → Swift throws

استيرادات C والمؤشرات

يمكن لـ Swift استدعاء العديد من واجهات برمجة التطبيقات الخاصة بـ C مباشرةً. استخدم الاستيراد الشرطي لتحقيق قابلية النقل، وحوّل char* باستخدام 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)

مثال عشوائي باستخدام C

استدعِ دوال C الخاصة بالمنصة (مثل arc4random_uniform على Apple، وrandom() على Linux). واجعل الأمثلة صغيرة وقابلة للنقل.

#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 → throws

تُستورد معاملات NSError** في Objective-C بصفتها throws. استخدم 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 (واجعلها ترث من 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**؟

مراجعة

مراجعة:

  • استورد Darwin/Glibc واستدعِ واجهات C البسيطة.
  • استخدم جسور Foundation للسلاسل والمجموعات.
  • تتطابق NSError** في Objective-C مع throws في Swift.
البدء مجانًا

تعلم Swift مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
122
الدروس
409

الأسئلة الشائعة

هل درس «لمحة عن التكامل بين C وObj-C (من دون تفاصيل iOS)» مجاني؟

نعم — نص درس «لمحة عن التكامل بين C وObj-C (من دون تفاصيل iOS)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 3 دروس في المجموع.

ماذا ستتعلم في «لمحة عن التكامل بين C وObj-C (من دون تفاصيل iOS)»؟

استورد وحدات نظام C، واستدعِ واجهات POSIX/C البسيطة، واستخدم جسور Foundation (String/NSString والمصفوفات والقواميس). تعرّف إلى كيفية تحوّل NSError** في Objective-C إلى throws في Swift. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «لمحة عن التكامل بين C وObj-C (من دون تفاصيل iOS)»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نصوص Swift البرمجية (swift shebang) وأدوات سطر الأوامر
  2. لمحة عن التكامل بين C وObj-C (من دون تفاصيل iOS)
  3. تغليف الملفات الثنائية باستخدام SPM
← العودة إلى Swift Academy