expect وactual
تنفيذات خاصة بالمنصة
expect وactual درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
الحاجة إلى شيفرة خاصة بالمنصة
لا يملك بعض الوظائف تطبيقًا مشتركًا — مثل الحصول على اسم نظام التشغيل أو UUID أو المنصة الحالية. يحل KMM هذه المشكلة باستخدام آلية expect/actual.
إعلانات expect
تعلنون في commonMain عن دالة أو فئة expect — وهي عقد بلا جسم. ويمكن للشيفرة المشتركة استدعاؤها.
// commonMain
expect fun platformName(): Stringactual على Android
توفر كل منصة تطبيقًا من نوع actual يطابق التوقيع.
// androidMain
actual fun platformName(): String = "Android " + android.os.Build.VERSION.SDK_INTactual على iOS
توفر مجموعة مصادر iOS نسختها الخاصة باستخدام واجهات برمجة التطبيقات الأصلية.
// iosMain
import platform.UIKit.UIDevice
actual fun platformName(): String =
UIDevice.currentDevice.systemName + " " + UIDevice.currentDevice.systemVersionاستخدامه في الشيفرة المشتركة
تستدعي الشيفرة المشتركة الدالة المتوقعة كما لو كانت موجودة؛ ويربط المترجم actual الصحيح بكل هدف.
// commonMain
class Platform {
val name: String get() = platformName()
}فئات expect
يمكنكم توقّع فئة كاملة. وتوفر كل منصة فئة actual بأعضاء مطابقين.
// commonMain
expect class FileReader(path: String) {
fun read(): String
}تطبيقات الفئات الفعلية
تطبّق المنصات الفئة المتوقعة باستخدام واجهات برمجة تطبيقات الملفات الأصلية (مثل Java IO على Android وFoundation على iOS).
// androidMain
actual class FileReader actual constructor(private val path: String) {
actual fun read(): String = java.io.File(path).readText()
}expect مع typealias
يمكن أن يكون actual عبارة عن typealias لنوع موجود في المنصة، مما يلغي الحاجة إلى غلاف.
// commonMain
expect class Uuid
// jvm/androidMain
actual typealias Uuid = java.util.UUIDقواعد مطابقة التوقيع
يجب أن يطابق actual expect مطابقة تامة: الاسم نفسه والمعلمات نفسها ونوع الإرجاع نفسه. ويؤدي عدم التطابق إلى خطأ في الترجمة، مما يضمن الاتساق بين المنصات.
متى لا تستخدمون expect/actual
فضّلوا الواجهات مع تطبيقات المنصة التي تُحقن أثناء التشغيل عندما يكون التجريد أكثر مرونة. وخصّصوا expect/actual للبدائيات الصغيرة والثابتة الخاصة بالمنصة.
مثال توضيحي للشيفرة المشتركة
خارج KMM، تتمثل الفكرة نفسها ببساطة في استدعاء تجريد. وهنا تحل دالة عادية محل استدعاء المنصة.
fun platformName(): String = "Demo Platform"
fun main() {
println("Running on " + platformName())
}تحقق سريع
أين يُكتب إعلان expect، وأين توجد تطبيقات actual الخاصة به؟
مراجعة
تسد expect/actual الفجوات بين المنصات:
- يعلن
expectعن العقد فيcommonMain - يطبّقه
actualلكل منصة (أو باستخدامtypealias) - يجب أن تتطابق التوقيعات تمامًا
- فضّلوا الواجهات للتجريدات المرنة
التالي: مشاركة منطق الأعمال.
الأسئلة الشائعة
هل درس «expect وactual» مجاني؟
نعم — نص درس «expect وactual» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «expect وactual»؟
تنفيذات خاصة بالمنصة تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «expect وactual»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بنية مشروع KMM
- expect وactual
- مشاركة منطق الأعمال
- واجهات API للمنصة