Saya mencoba membuat aplikasi iPhone universal, tetapi aplikasi tersebut menggunakan kelas yang hanya ditentukan dalam versi SDK yang lebih baru. Kerangka ada pada sistem yang lebih lama, tetapi kelas yang ditentukan dalam kerangka tidak.
Saya tahu saya ingin menggunakan semacam tautan yang lemah, tetapi setiap dokumentasi yang saya temukan berbicara tentang pemeriksaan runtime untuk keberadaan fungsi - bagaimana cara memeriksa bahwa kelas itu ada?
ios
backwards-compatibility
weak-linking
psikotik
sumber
sumber
Jawaban:
TLDR
Arus:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
Warisan:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
Cepat 2+
Meskipun secara historis disarankan untuk memeriksa kemampuan (atau keberadaan kelas) daripada versi OS tertentu, ini tidak berfungsi dengan baik di Swift 2.0 karena diperkenalkannya pemeriksaan ketersediaan .
Gunakan cara ini sebagai gantinya:
if #available(iOS 9, *) { // You can use UIStackView here with no errors let stackView = UIStackView(...) } else { // Attempting to use UIStackView here will cause a compiler error let tableView = UITableView(...) }
Catatan: Jika Anda malah mencoba menggunakan
objc_getClass()
, Anda akan mendapatkan error berikut:Versi Swift sebelumnya
if objc_getClass("UIAlertController") != nil { let alert = UIAlertController(...) } else { let alert = UIAlertView(...) }
Perhatikan bahwa
objc_getClass()
lebih dapat diandalkan daripadaNSClassFromString()
atauobjc_lookUpClass()
.Objective-C, iOS 4.2+
if ([SomeClass class]) { // class exists SomeClass *instance = [[SomeClass alloc] init]; } else { // class doesn't exist }
Lihat jawaban code007 untuk lebih jelasnya .
OS X atau iOS versi sebelumnya
Class klass = NSClassFromString(@"SomeClass"); if (klass) { // class exists id instance = [[klass alloc] init]; } else { // class doesn't exist }
Menggunakan
NSClassFromString()
. Jika dikembalikannil
, kelas tersebut tidak ada, jika tidak maka akan mengembalikan objek kelas yang dapat digunakan.Ini adalah cara yang direkomendasikan menurut Apple dalam dokumen ini :
sumber
Class
instance yang dikembalikan olehNSClassFromString
(tetapkan keid
) dan panggil penyeleksi pada instance itu.canImport
. ProposalUntuk project baru yang menggunakan SDK dasar iOS 4.2 atau yang lebih baru, ada pendekatan baru yang direkomendasikan, yaitu menggunakan metode kelas NSObject untuk memeriksa ketersediaan kelas yang tertaut dengan lemah pada waktu proses. yaitu
if ([UIPrintInteractionController class]) { // Create an instance of the class and use it. } else { // Alternate code path to follow when the // class is not available. }
sumber: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3
Mekanisme ini menggunakan makro NS_CLASS_AVAILABLE, yang tersedia untuk sebagian besar framework di iOS (perhatikan mungkin ada beberapa framework yang belum mendukung NS_CLASS_AVAILABLE - periksa catatan rilis iOS untuk ini). Konfigurasi pengaturan tambahan mungkin juga diperlukan yang dapat dibaca di tautan dokumentasi Apple yang disediakan di atas, namun, keuntungan dari metode ini adalah Anda mendapatkan pemeriksaan tipe statis.
sumber
UIAlertController
sementara masih mendukung iOS 7. Jawaban code007 benar, tetapi konfigurasi tambahan yang diperlukan adalah untuk menautkan dengan lemah (diatur dariRequired
keOptional
) UIKit dalam proyek Anda (setidaknya untuk situasi ini).