在swift3中创建多种类型的变量

时间:2017-03-29 06:41:41

标签: ios swift generics types

我有一个结构体,在这个结构中,我有变量,我希望它是UITextField UIButton的任何类型private struct ValidationObject { var textField: RITextFieldLine ... } 。我想我可以用某种方式使用泛型。 所以,我的代码看起来像这样

textField
类型为RITextFieldLine

MongoClient mongoClient = new MongoClient("localhost",27017); MongoDatabase database = mongoClient.getDatabase("Test"); MongoCollection<Document> collection = database.getCollection("History"); Document doc = new Document(); doc.append("$match",new Document("thId","001")); Document group = new Document(); group.append("$group", new Document("_id",new Document().append("Id", "$Id").append("controller", "$controller").append("mod" , "$mod").append("variable" , "$variable")) .append("variable" , new Document("$first", "$$ROOT")) .append("data",new Document().append("$push", new Document().append("value", "$value").append("updatedDateTime","$updatedTime")))); ArrayList<Document> docList = new ArrayList<Document>(); docList.add(doc); docList.add(group); List<Document> results =collection.aggregate(docList).into(new ArrayList<Document>()); for(Document res: results){ System.out.println(res.toJson()); } 变量是我的自定义视图。但我不希望它属于这种特定类型。

2 个答案:

答案 0 :(得分:2)

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

protocol Validateable {}

extension UITextField: Validateable {}

extension UIButton: Validateable {}

extension AnyOtherTypeYouLike: Validateable {}

然后你可以在你的struct

中使用它
private struct ValidationObject {
   var validationItem: Validateable
    ...
}

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

答案 1 :(得分:0)

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

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

否则:

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

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

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