高質量的代碼遵循幾個原則。一個是單責任原則,即指出一個班級應該只有一個責任,或者 - 正如Bob叔叔所說 - 應該只有一個班級改變的原因。
另一個原則是依賴倒置原則:一個類不應該依賴較低級別的類,而應該依賴這些較低級別類實現的抽象(協議)。這也意味着所有依賴必須傳遞給使用它們的類。
施加在你的問題的一個解決方案可以是:
- 視圖控制器具有被定義爲一個協議數據源屬性。
- 幾個類實現了這個協議,每個都適用於不同的iOS版本。
- 存在一個只有準備選擇正確版本的類。這個版本的選擇可以以多種方式來完成,我堅持
#available
數據源協議:
protocol ViewControllerDataSourcing: class {
var text:String { get }
}
,它的實現:
class ViewControllerDataSourceIOS10: ViewControllerDataSourcing {
var text: String {
return "This is iOS 10"
}
}
class ViewControllerDataSourceIOS11: ViewControllerDataSourcing {
var text: String {
return "This is iOS 11"
}
}
class ViewControllerDataSourceIOSUnknown: ViewControllerDataSourcing {
var text: String {
return "This is iOS Unknown"
}
}
是選擇正確的版本類的類:
class DataSourceSelector{
class func dataSource() -> ViewControllerDataSourcing {
if #available(iOS 11, *) {
return ViewControllerDataSourceIOS11()
}
if #available(iOS 10, *) {
return ViewControllerDataSourceIOS10()
}
return ViewControllerDataSourceIOSUnknown()
}
}
最後視圖控制器
class ViewController: UIViewController {
var dataSource: ViewControllerDataSourcing?
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = DataSourceSelector.dataSource()
label.text = dataSource?.text
}
}
這是一個非常簡單的例子,應突出負責不同的組件。
在現實世界的代碼中,我可能不會在視圖控制器中設置數據源,但使用視圖控制器結構或配置器來設置它。
這將有助於如果您在您的問題,一些相關的代碼。舉例說明你在做什麼,並清楚描述你想做什麼。 – rmaddy
我認爲真正的問題是'#available'沒有交流。例如,如果這是iOS 11,則可以包括這些東西,但如果這是iOS 11,則不能排除這些東西。 – matt
您的類的兩個版本是否具有完全相同的成員? – Sweeper