简介
在我的应用程序中,我有一个名为“ElementData”的超类以及多个继承自它的子类。
每个子类都有自己的validateModel()方法,该方法返回不同类型的值,具体取决于类-始终以数组形式返回。
换句话说:该方法在每个子类中返回不同类型的值。
例子
Class A: func validateModel() -> [String]
Class B: func validateModel() -> [Int]
Class C: func validateModel() -> [MyCustomEnum]
如您所见,仅返回值彼此不同。
编辑:validateModel()方法的示例:
Class 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
}
Class 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都有自己的类。由于集合视图的重用行为,必须将输入的值存储在模型中。
该模型还负责验证,并根据单元格返回一个值数组,告诉单元格哪些字段应该具有红色边框(标记为无效)。
这有时可以是枚举、整数或字符串。
我想要实现的目标
正如您所想象的那样,在每个子类中拥有几乎相同的validationMethods非常烦人,因为每次我想在其中一个类上使用该方法时都需要进行downcast。
因此,我想保持返回类型开放,即不在父类中指定特定的类型,因为子类应该能够返回任何类型。然后,我将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()
的操作,以使用返回值来推断类型。 - SulthanvalidateModel()
,要么更改其行为。 - Alexander