SWIFT - 如何获取阵列的类型?

时间:2015-03-05 14:17:37

标签: arrays swift types generics

我正在编写一个通用方法,该方法在参数中使用Dictionary和给定类型来构建对象。

例如,如果你发出一个SOAP请求来获取一部电影并在Dictionary中收回响应,你就可以:

var movie : Movie = myGenericMethod(dic : Dictionary, objectToIntrospect : Movie()) as Movie

与之合作:

  • 简单对象
  • 复杂对象

但是如果你有一个对象数组我会遇到问题。 所以想象你的电影对象包含一个演员阵列......

通过反思,我获得了所有类型的课程属性。 有了这个,我构建一个包含我的类型的Any对象数组。 例如,包含在其他对象(电影中的Actor)中的对象:

//All type of attributes of my movie object, at index [i] i have my "Actor" object
var anyType : Any = typesOfProperties[i]

//I cast it in object
var objectType : NSObject = anyType as NSObject

//Dont worry about this method, it's just for get the dictionary
var otherDico : NSDictionary = ConverterUtilities.extractDictionaryFromOtherDictionary(dict, dicoName: property, soapAction: soapAction) as NSDictionary

//I build the Actor object with the data of the dictionary. objectType.self give the Actor type
var propertyObject: NSObject = self.buildAnyObjectWithDictionary(otherDico, soapAction: "", objectToIntrospect:objectType.self) as NSObject

//I set the property Actor in my Movie object (myObjectToReturn)... The "property" parameter is the key 
ConverterUtilities.setPropertyValue(property, value: propertyObject, objectToReturn : myObjectToReturn, isObject : true)

它的工作完美......如果我的电影对象中只有一个演员,那么" propertyObject"将是一个Actor类型,这个原因objectType是一个Actor对象。

但是,如果我有一个数组,我会在处理数组的方法中重定向,而我的objectType返回" Swift._NSSwiftArrayImpl"和我的anyType对象返回"([myproject.Actor])"。 我不需要知道这只是一个数组,因为我知道它。但我需要知道这是一个 Actor 的数组,用于动态构建一些Actor对象!

这就是我现在所拥有的:

var objToAdd: NSObject = self.buildAnyObjectWithDictionary(newDic, soapAction: "", objectToIntrospect: Actor()) as NSObject

arraySpecific.append(objToAdd)

正如您所看到的,如果我对类型进行硬编码,这项工作就完美无缺。但我需要像前面的例子一样!像那样:

var objToAdd: NSObject = self.buildAnyObjectWithDictionary(newDic, soapAction: "", objectToIntrospect: anObjectWithActorType) as NSObject

arraySpecific.append(objToAdd)

(第一版和第二版之间的差异是objectToIntrospect参数)

你知道我如何使用我的Any对象(包含:([myproject.Actor])来构建一个Actor的实例吗?

我真的需要你的帮助!问候!

PS:抱歉我的英语不好,我希望你理解我:)。

1 个答案:

答案 0 :(得分:1)

好的伙计们,我回来了我的帖子,因为我找到了一个解决方案: 我创建了一个大师班,我所有的班级都是这门班的。

这个超类的方法名称为getArrayType。

如果我的一个子类需要与我的泛型方法一起使用,并且如果她包含一个数组,则需要覆盖getArrayType。

就像那样:

override func getArrayType(anyType : Any) -> String {
    var className = " "
    if(anyType as? NSObject == rows){
        className = Properties.PROJECT_NAME + ".SimpleRow"
    }
    return className
}

我称之为这种方法(TObject是我的超级班):

var className = (objectToIntrospect as TObject).getArrayType(anyType)
var obj: AnyClass! = NSClassFromString(className)

这项工作非常完美,但您需要覆盖一个方法。如果你遇到同样的问题,我希望这有助于你!