Saya telah menyatakan protokol Swift:
protocol Option {
var name: String { get }
}
Saya mendeklarasikan beberapa implementasi protokol ini — beberapa kelas, beberapa enum.
Saya memiliki pengontrol tampilan dengan properti yang dideklarasikan sebagai:
var options: [Option] = []
Ketika saya mencoba dan mengatur properti ini ke array objek yang mengimplementasikan Option
protokol di VC lain prepareForSegue
, saya mendapatkan error runtime:
fatal error: array cannot be bridged from Objective-C
Mengapa ini tidak berhasil? Kompiler memiliki semua informasi yang dibutuhkannya, dan saya sama sekali tidak mengerti apa hubungannya Objective-C dengannya — proyek saya hanya berisi file Swift, dan array ini tidak masuk atau keluar dari metode kerangka kerja yang akan mengharuskan mereka dijembatani NSArray
.
ios
swift
swift-protocols
Robert Atkins
sumber
sumber
@objc
protokol Anda? stackoverflow.com/a/28029568/377369Jawaban:
Saya telah menemukan solusi. Ini cukup ... tidak memuaskan , tapi berhasil. Di mana saya mengatur array pada pengontrol tampilan tujuan yang saya lakukan:
destinationViewController.options = options.map({$0 as Option})
sumber
options as [Option]
Anda telah memberikan komentar yang sangat terbuka, yang menunjukkan sumber masalah. Sebuah "Array of things yang mengimplementasikan Option" bukanlah Array of Option.
Masalahnya adalah dengan jenis
options
punggung pada titik tempat Anda membuatnya (dalamprepareForSegue
). Anda tidak menunjukkan kode itu, tetapi saya bertaruh bahwa Anda gagal memasukkan / mengetiknya pada saat itu. Itulah mengapa penugasan gagal.options
mungkin serangkaian hal yang sebenarnya terjadi karena mengadopsi Opsi, tetapi itu tidak cukup; itu harus diketik sebagai larik Opsi.Jadi, kembali ke dalam
prepareForSegue
bentukoptions
seperti ini:let options : [Option] = // ... whatever ...
Sekarang Anda dapat menetapkannya langsung ke
destinationViewController.options
.Berikut adalah kasus uji singkat (di taman bermain; Saya tidak suka taman bermain, tetapi mereka dapat menggunakannya):
protocol Option { var name : String {get} } class ViewController : UIViewController { var options : [Option] = [] } enum Thing : Option { var name : String { get { return "hi" } } case Thing } let vc = ViewController() let options : [Option] = [Thing.Thing] vc.options = options // no problem
(Saya juga menguji ini di aplikasi aktual dengan yang sebenarnya
prepareForSegue
, dan berfungsi dengan baik.)sumber
viewController.options = things as [Option]
) atau membuat variabel temp yang diketik secara eksplisit[Option]
seperti yang Anda sarankan di sini, sebenarnya berfungsi. Dalam kedua kasus saya mendapatkan error runtime.Saya mengalami masalah yang sama dan memperbaikinya dengan menandai protokol saya
@objc
, dalam kasus Anda akan terlihat seperti ini@objc protocol Option { var name: String { get } }
Dapatkan solusi dari jawaban ini
sumber
Yang ini juga berfungsi dengan baik
destinationViewController.options = options.map{$0}
sumber