【发布时间】:2019-11-26 17:14:33
【问题描述】:
简介
在我的应用中,我有一个名为“ElementData”的超类和几个继承自它的子类。
每个子类都有自己的 validateModel() 方法,该方法返回 不同的类型,取决于类 - 总是在一个数组中。
换句话说:该方法在每个子类中返回不同的类型。
示例
A类:func validateModel() -> [String]
B类:func validateModel() -> [Int]
C类:func validateModel() -> [MyCustomEnum]
如您所见,只有返回值彼此不同。
编辑:validateModel() 方法示例:
A 类:
func validateModel() -> [DefaultElementFields]{ // DefaultElementFields is an enum with the different view types of my collection view
var checkResult: [DefaultElementFields] = []
if name == "" {
checkResult.append(.Name)
}
if Int(rewardedPoints) == nil {
checkResult.append(.Points)
}
if description == "" {
checkResult.append(.Description)
}
if selectedImage == nil {
checkResult.append(.Image)
}
return checkResult
}
B 类:
func validateModel() -> [Int] { // returns the index of the text field which is wrong
var checkResult: [Int] = []
let filledValues = codes.filter {
$0 != ""
}
if filledValues.count == 0 { // if no values have been entered, all fields should be marked red.
checkResult.append(-1)
return checkResult
}
for (i, code) in codes.enumerated() {
if code != "" && (code.count < 3 || code.count > 10 || code.rangeOfCharacter(from: NSCharacterSet.alphanumerics.inverted) != nil){ // code must have more than 3 and less than 11 characters. No symbols are allowed.
checkResult.append(i)
}
}
return checkResult
}
编辑:这些课程的用途:
这些类基本上存储数据用户输入到集合视图单元格,例如文本、数字或日期。每个 CollectionViewCellType 都有自己的类。由于集合视图的重用行为,有必要将输入的值存储在模型中。
模型还负责验证并根据单元格返回一个值数组,告诉单元格哪些字段应该有红色边框(是标记为无效)。
这有时可以是 Enum、Int 或 String。
我想要达到的目标
如您所想,在每个 子类 中拥有几乎相同的验证方法是很烦人的,因为每次我想使用方法之一。
因此,我想保持 返回类型打开,即不要在父类中指定特定的类型,因为子类应该能够返回任何类型。然后,我会将 validateModel() 方法移到父类中,并在其子类中覆盖该方法。
我想到了一个使用 泛型 的解决方案(如果可能的话)。
我尝试了什么
这是我对整个事情的通用方法:
class ElementData {
func validateModel<T>() -> [T] {
return [1] as! [T] // just a test return
}
}
以及方法的调用:
dataObject.validateModel() // dataObject inherits from ElementData -> has access to validateModel()
不幸的是,它不起作用,我收到以下错误:
“无法推断通用参数'T'”
总结:
- 我有一个超类“ElementData”和几个子类(继承的类)
- 每个子类都有一个方法 validateModel(),在该方法中验证模型
- 只有 返回类型 子类中的 validateModel() 方法不同 - 所以我想将方法放在父类 (ElementData) 中,并且只是 覆盖子类
这可能吗,如果可以,怎么做?
任何帮助将不胜感激。
【问题讨论】:
-
请向我们展示您的验证方法的至少两种实现。有两种可能性。要么使用协议而不是超类,要么使整个类通用。
-
要推断泛型类型,您必须执行
let array: [Int] = dataObject.validateModel()之类的操作来使用返回值推断类型。 -
@Sulthan 但是我仍然必须放弃每个对象才能访问该方法并知道它返回什么,对吧?顺便说一句:见编辑
-
到目前为止,我在您的方法中没有看到任何共同点,我不确定您为什么还要平等地调用这些方法。
-
@Sulthan 每个类的方法中的代码都不同-但基本函数仅在返回类型上有所不同。现在我必须打开单元格的类型才能知道它是哪个 elementDataClass。如果我在顶级类中有 validateModel 方法,我可以在每个 DataElementClass 上调用它而不强制转换它。我希望现在更清楚:)
标签: arrays swift class generic-programming