पर आधारित जेनेरिक पैरामीटर मान के साथ UITableViewCell पर उप-वर्ग पर कॉल विधि UITableViewCell उप-वर्गों में "सेटअप"-विधि के कॉलिंग को सरल बनाना चाहते हैं। हालांकि, सभी सेटअप विधियां समान नहीं हैं, लेकिन उनके पैरामीटर एक ही प्रकार से प्राप्त होते हैं। क्या जेनरिक्स या प्रोटोकॉल के साथ हर बार पैरामीटर डालना नहीं है?प्रोटोकॉल या बेस क्लास
सबसे पहले मैं इस तरह एक cellForRow-विधि:
class DataSource<V : UIViewController, T: TableViewCellData, VM: ViewModel> : NSObject, UITableViewDataSource, UITableViewDelegate {
var dataCollection: TableViewDataCollection<T>!
var viewModel: VM!
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellData = dataCollection.object(for: indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: cellData.identifier(), for: indexPath)
if let setupableCell = cell as? CellDataSetupable {
setupableCell.setup(with: cellData, viewModel: viewModel)
}
return cell
}
}
protocol CellDataSetupable : class {
func setup(with cellData: TableViewCellData, viewModel: ViewModel)
}
जहाँ मैं सेटअप cellData और ViewModel के साथ सेल।
मेरी (कई) कस्टम UITableViewCell उपवर्ग में:
extension BlurbTableViewCell : CellDataSetupable {
func setup(with cellData: TableViewCellData, viewModel: ViewModel) {
guard let cellData = cellData as? HomeViewTableViewCellData else { return }
guard let viewModel = viewModel as? HomeViewModel else { return }
// Use cellData and viewModel to setup cell appearance
}
}
जहां HomeViewTableViewCellData
TableViewCellData
और HomeViewModel
के उपवर्ग है ViewModel
के उपवर्ग है इसके बजाय मैं गार्ड को हटा दें और सीधे कुछ इस तरह लिखना चाहते हैं :
extension BlurbTableViewCell : CellDataSetupable< {
func setup(with cellData: HomeViewTableViewCellData, viewModel: HomeViewModel) {
// Use cellData and viewModel to setup cell appearance
}
}
का प्रयास किया गया रों olutions (वह काम नहीं करता):
हालांकि, मैं associatedtype उपयोग नहीं कर सकते/प्रोटोकॉल पर typealias के रूप में यह एक त्रुटि प्रोटोकॉल cellForRow विधि में "कास्टिंग पर पैदा करता है ... केवल एक सामान्य बाधा के रूप में इस्तेमाल किया जा सकता क्योंकि इसमें स्वयं या संबंधित प्रकार की आवश्यकताएं हैं "। "Unknown class in interface builder file" when using class which inherits from a generic class in a Storyboard
मैं भी एक सामान्य baseclass उपयोग नहीं कर सकते के रूप में इंटरफ़ेस बिल्डर तो दुर्घटना होगा:: मैं इस विधि की कोशिश की How to create generic protocols in Swift? (यह भी देखें नीचे स्थित संपादित 2)
कोई भी विचार या मैं साथ रहने के लिए है मेरी कास्टिंग?
संपादित करें 1: नैट मान से नीचे दिए गए सुझावों मैं इस कोड (ध्यान दें कि मैं कुछ सामान्य प्रकार का नया नाम दिया है) की कोशिश की करने के बाद:
// This works fine
extension TransactionTableViewCell : CellDataSetupable {
typealias CellData = HomeViewTableViewCellData
typealias VM = HomeViewModel
func setup(with cellData: CellData, viewModel: VM) {
//Setup cell appearance ...
}
}
यह पंक्ति भी ठीक काम करता है: (ध्यान दें अतिरिक्त जहां खंड)
class DataSource<VC : UIViewController, TVCD: TableViewCellData, VM: ViewModel, CDS: CellDataSetupable> : NSObject, UITableViewDataSource, UITableViewDelegate where CDS.TVCD == TVCD, CDS.VM == VM {
// ...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellData = dataCollection.object(for: indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: cellData.identifier(), for: indexPath)
if let setupableCell = cell as? CDS {
setupableCell.setup(with: cellData, viewModel: viewModel)
}
return cell
}
लेकिन
class HomeTableViewDataSource: DataSource<HomeViewController, HomeViewTableViewCellData, HomeViewModel> {
से बदल रहा है एक UITableViewCell वर्ग के लिए एक सामान्य baseclass का एक ठोस संस्करण का उपयोग करना या तो संभव नहीं है:
Using 'CellDataSetupable' as a concrete type confirming to protocol 'CellDataSetupable' is not supported
संपादित करें 2:
कोclass HomeTableViewDataSource: DataSource<HomeViewController, HomeViewTableViewCellData, HomeViewModel, CellDataSetupable> {
इस त्रुटि दे। Why can't interface builder use a concrete generic subclass of of UIView?
कृपया, अगर यह काम करता है तो मुझे बताएं। दिलचस्प। – hasan83
मैं सेलविल्लडिस्प्ले टेबलव्यू प्रतिनिधि विधि के साथ केवल सेल पैरामीटर के प्रकार को बदलकर ऐसा करने का प्रयास करता हूं। यह काम नहीं करता है। विधि को ओवरराइडिंग के रूप में नहीं माना जाता है। शायद उन्होंने इसे इस तरह लागू नहीं किया। – hasan83
मेरी मदद करने की कोशिश करने के लिए धन्यवाद। यह सही दिशा में एक प्रयास हो सकता है। हालांकि, यह डेटासोर्स के मेरे उप-वर्गों पर शिकायत करता है। के रूप में आप एक सामान्य पैरामीटर के रूप में CellDataSetupable कहा, मैं इनपुट को यह करने के लिए कुछ बात है, लेकिन यह पैदा करता है एक 'एक CellDataSetupable एक ठोस प्रकार प्रोटोकॉल CellDataSetupable के अनुरूप के रूप में उपयोग करते हुए supported' नहीं है। अधिक कोड के लिए उपरोक्त प्रश्न में "संपादित करें 1" देखें। – Sunkas