حمولات userInfo للإشعارات
أرفق بيانات محددة النوع بالإشعارات.
حمولات userInfo للإشعارات درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
userInfo للإشعار
يمكن أن يحمل الإشعار بيانات في قاموس userInfo الخاص به، مما يتيح للمراقبين تلقي تفاصيل حول ما حدث.
الإرسال باستخدام userInfo
مرّر قاموسًا إلى post(name:object:userInfo:). تكون المفاتيح والقيم من النوع Any، لذا يمكن للقاموس استيعاب أي حمولة.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("scoreChanged")
center.post(name: name, object: nil, userInfo: ["score": 100])
print("Posted with payload")قراءة userInfo
داخل المراقب، اقرأ notification.userInfo وأجرِ تحويلًا نوعيًا للقيمة المتوقعة.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("scoreChanged")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
if let score = note.userInfo?["score"] as? Int {
print("Score: \(score)")
}
}
center.post(name: name, object: nil, userInfo: ["score": 42])قيم متعددة
يمكن للقاموس أن يحتوي على عدة مفاتيح، مما يتيح تجميع البيانات المرتبطة معًا.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("login")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
let user = note.userInfo?["user"] as? String ?? "?"
let admin = note.userInfo?["admin"] as? Bool ?? false
print("\(user) admin=\(admin)")
}
center.post(name: name, object: nil, userInfo: ["user": "ada", "admin": true])مفاتيح آمنة نوعيًا
يُعد استخدام المفاتيح النصية الحرفية عرضةً للأخطاء. عرّف ثوابت لتجنب عدم التطابق بين المرسل والمراقب.
import Foundation
enum Keys { static let amount = "amount" }
let center = NotificationCenter.default
let name = Notification.Name("purchase")
center.post(name: name, object: nil, userInfo: [Keys.amount: 9.99])
print("Used a constant key")إجراء التحويل النوعي بحذر
بما أن القيم من النوع Any، فقد تفشل عمليات التحويل النوعي. استخدم الربط الاختياري حتى لا يؤدي النوع الخاطئ إلى تعطل التطبيق.
import Foundation
let note = Notification(name: Notification.Name("x"), object: nil, userInfo: ["n": "oops"])
if let n = note.userInfo?["n"] as? Int {
print(n)
} else {
print("Wrong type, handled safely")
}استخدام البنى المخصصة كحمولة
يمكنك تخزين بنية كاملة كقيمة ثم إجراء تحويل نوعي لها عند استعادتها، مع الحفاظ على حمولات محددة النوع.
import Foundation
struct Event { let id: Int }
let note = Notification(name: Notification.Name("e"), object: nil, userInfo: ["event": Event(id: 7)])
if let e = note.userInfo?["event"] as? Event {
print("Event id: \(e.id)")
}تغليف عملية post
تحافظ دالة مساعدة تنشئ userInfo على اتساق إنشاء الحمولات في جميع أنحاء التطبيق.
import Foundation
let name = Notification.Name("progress")
func postProgress(_ value: Int) {
NotificationCenter.default.post(name: name, object: nil, userInfo: ["value": value])
}
postProgress(75)
print("Posted progress")تغليف عملية القراءة
اربط الدالة المساعدة بموصل وصول محدد النوع حتى لا يكرر المراقبون منطق التحويل النوعي.
import Foundation
extension Notification {
var progressValue: Int? { userInfo?["value"] as? Int }
}
let n = Notification(name: Notification.Name("progress"), object: nil, userInfo: ["value": 50])
print(n.progressValue ?? -1)القيمة الافتراضية مقابل المفاتيح المفقودة
إذا كان المفتاح غير موجود، ينتج عن التحويل النوعي القيمة nil. وفّر قيمة افتراضية مناسبة باستخدام معامل دمج nil.
import Foundation
let n = Notification(name: Notification.Name("y"), object: nil, userInfo: [:])
let count = n.userInfo?["count"] as? Int ?? 0
print("Count defaulted to \(count)")حافظ على صغر الحمولات
يُفضّل استخدام userInfo للبيانات الصغيرة القابلة للتسلسل. أما الكائنات الكبيرة، فمرّر معرّفًا ودع المراقبين يجلبون بقية البيانات.
import Foundation
let name = Notification.Name("itemUpdated")
// Send just an id, not a heavy object graph.
NotificationCenter.default.post(name: name, object: nil, userInfo: ["id": 1234])
print("Posted a lightweight payload")تحقق سريع
ما نوع القيم المخزنة في قاموس userInfo الخاص بالإشعار؟
مراجعة
يحمل قاموس userInfo بيانات الإشعار على هيئة قيم من النوع Any، لذا يجب على المراقبين إجراء التحويل النوعي بحذر. استخدم مفاتيح ثابتة ودوالًا مساعدة وموصلات وصول محددة النوع، وقدّم قيمًا افتراضية للمفاتيح المفقودة، وحافظ على صغر الحمولات. التالي: إزالة المراقبين بأمان.
الأسئلة الشائعة
هل درس «حمولات userInfo للإشعارات» مجاني؟
نعم — نص درس «حمولات userInfo للإشعارات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «حمولات userInfo للإشعارات»؟
أرفق بيانات محددة النوع بالإشعارات. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «حمولات userInfo للإشعارات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نشر الإشعارات ومراقبتها
- حمولات userInfo للإشعارات
- إزالة المراقبين بأمان
- بدائل نمط المراقب