TLDR
ปัจจุบัน:
- รวดเร็ว :
if #available(iOS 9, *)
- Obj-C, iOS :
if (@available(iOS 11.0, *))
- Obj-C, OS X :
if (NSClassFromString(@"UIAlertController"))
มรดก:
- Swift (เวอร์ชันก่อน 2.0) :
if objc_getClass("UIAlertController")
- Obj-C, iOS (เวอร์ชันก่อนหน้า 4.2) :
if (NSClassFromString(@"UIAlertController"))
- Obj-C, iOS (เวอร์ชันก่อน 11.0) :
if ([UIAlertController class])
Swift 2+
แม้ว่าในอดีตจะได้รับการแนะนำให้ตรวจสอบความสามารถ (หรือการมีอยู่ของคลาส) มากกว่าเวอร์ชันของระบบปฏิบัติการที่เฉพาะเจาะจง แต่สิ่งนี้ทำงานได้ไม่ดีใน Swift 2.0 เนื่องจากมีการแนะนำการตรวจสอบความพร้อมใช้งานการตรวจสอบความพร้อมใช้งาน
ใช้วิธีนี้แทน:
if #available(iOS 9, *) {
let stackView = UIStackView(...)
} else {
let tableView = UITableView(...)
}
หมายเหตุ:หากคุณพยายามใช้แทนคุณobjc_getClass()
จะได้รับข้อผิดพลาดต่อไปนี้:
⛔️ 'UIAlertController' พร้อมใช้งานบน iOS 8.0 หรือใหม่กว่าเท่านั้น
Swift เวอร์ชันก่อนหน้า
if objc_getClass("UIAlertController") != nil {
let alert = UIAlertController(...)
} else {
let alert = UIAlertView(...)
}
ทราบว่าobjc_getClass()
มีความน่าเชื่อถือมากกว่าNSClassFromString()
objc_lookUpClass()
หรือ
Objective-C, iOS 4.2+
if ([SomeClass class]) {
SomeClass *instance = [[SomeClass alloc] init];
} else {
}
ดูคำตอบ code007 สำหรับรายละเอียดเพิ่มเติม
OS X หรือ iOS เวอร์ชันก่อนหน้า
Class klass = NSClassFromString(@"SomeClass");
if (klass) {
// class exists
id instance = [[klass alloc] init];
} else {
// class doesn't exist
}
ใช้NSClassFromString()
. ถ้าส่งคืนnil
คลาสจะไม่มีอยู่มิฉะนั้นจะส่งคืนคลาสออบเจ็กต์ที่สามารถใช้ได้
นี่เป็นวิธีที่แนะนำตาม Apple ในเอกสารนี้ :
[... ] รหัสของคุณจะทดสอบการมีอยู่ของคลาส [a] ที่ใช้
NSClassFromString()
ซึ่งจะส่งคืนอ็อบเจ็กต์คลาสที่ถูกต้องถ้าคลาส [the] มีอยู่หรือไม่มีถ้ามันไม่มี หากมีคลาสอยู่รหัสของคุณสามารถใช้งานได้ [... ]