Swift Academy · บทเรียน

ข้อมูลส่วนเพิ่มเติม userInfo ของการแจ้งเตือน

แนบข้อมูลที่มีชนิดเข้ากับการแจ้งเตือน

บทเรียน 2 จาก 413 ขั้นตอน

ข้อมูลส่วนเพิ่มเติม userInfo ของการแจ้งเตือน เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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)")
}

การห่อหุ้มการส่ง

ฟังก์ชันช่วยที่สร้าง 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 ดังนั้นตัวเฝ้าดูจึงต้องแปลงชนิดอย่างระมัดระวัง ใช้คีย์ค่าคงที่ ฟังก์ชันช่วย และตัวเข้าถึงที่มีชนิดข้อมูลกำกับ กำหนดค่าเริ่มต้นให้คีย์ที่หายไป และเก็บข้อมูลส่งผ่านให้มีขนาดเล็ก ต่อไปคือการลบตัวเฝ้าดูอย่างปลอดภัย

เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “ข้อมูลส่วนเพิ่มเติม userInfo ของการแจ้งเตือน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ข้อมูลส่วนเพิ่มเติม userInfo ของการแจ้งเตือน”

แนบข้อมูลที่มีชนิดเข้ากับการแจ้งเตือน คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ข้อมูลส่วนเพิ่มเติม userInfo ของการแจ้งเตือน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การโพสต์และสังเกตการแจ้งเตือน
  2. ข้อมูลส่วนเพิ่มเติม userInfo ของการแจ้งเตือน
  3. การนำตัวสังเกตออกอย่างปลอดภัย
  4. ทางเลือกแทนรูปแบบตัวสังเกต
← กลับไปที่ Swift Academy