【问题标题】:Create variable with many types in swift3在 swift3 中创建具有多种类型的变量
【发布时间】:2017-03-29 06:41:40
【问题描述】:

我有一个结构,在这个结构中我有一个变量,我想成为UITextField 或UIButton 的任何类型。我想我可以以某种方式使用泛型。 所以,我的代码是这样的

private struct ValidationObject {
    var textField: RITextFieldLine
        ...
}

textField 类型为RITextFieldLine 的变量是我的自定义视图。但我不希望它属于这种特定类型。

【问题讨论】:

  • 这听起来像是一个 XY 问题。你的最终目标是什么?
  • 让它成为任何对象
  • 您可以使用UIView 或UIControl。您也可以添加自己的协议Validateable,然后通过扩展将此协议添加到各种控制类型;正如@Sweeper 所问,你想达到什么目的?
  • @Lu_ 这是个糟糕的建议,说真的。
  • 谢谢。我在方法中有这个结构的实例,稍后我希望能够将 textField 或 UIButton 传递给变量。 func addValidationTo(field textField: RITextFieldLine, type validationType: ValidationType, errorMessage errorMsg: String) { let object = ValidationObject(textField: textField, type: validationType, errorMessage: errorMsg) validationObjectsArray.append(object) }

标签: ios swift generics types


【解决方案1】:

我建议您使用协议来定义Validateable。然后,您可以通过扩展将此协议应用于任何所需的类:

protocol Validateable {}

extension UITextField: Validateable {}

extension UIButton: Validateable {}

extension AnyOtherTypeYouLike: Validateable {}

然后你可以在你的结构中使用它

private struct ValidationObject {
   var validationItem: Validateable
    ...
}

您还可以使用该协议来定义应由Validateable 对象实现的任何功能以及实现它们的扩展。

【讨论】:

  • 好的。非常感谢!
【解决方案2】:

如果您要分配的只是视图元素,那么:

private struct ValidationObject {
    var textField: UIView
        ...
}

否则:

private struct ValidationObject {
    var textField: Any
        ...
}

考虑到您的属性命名 (textField),我会说使用第一个。当您想将变量用作特定类型时,请记住使用它:

if let textField = validationObjectInstance.textField as? RITextFieldLine {
    textField.someMethodOrProperty
}

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多