SWIFT - 如何获取数组的类型?
SWIFT - How to get the type of an Array?
我正在编写一个通用方法,该方法采用字典和给定类型的参数来构建对象。
例如,如果您发出获取电影的 SOAP 请求并将响应保存在字典中,您可以:
var movie : Movie = myGenericMethod(dic : Dictionary, objectToIntrospect : Movie()) as Movie
适用于:
- 简单对象
- 复杂对象
但是如果你有一个对象数组,我会遇到问题。
假设您的电影对象包含一个演员数组...
通过反射,我获得了 class 的所有类型的属性。
有了这个,我构建了一个包含我的类型的任何对象的数组。
例如,一个对象包含在其他对象(电影中的演员)中:
//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" 将是一个演员类型,这导致 objectType 是一个演员对象。
但是,如果我有一个数组,我将在处理数组的方法中重定向,我的 objectType return "Swift._NSSwiftArrayImpl" 和我的 anyType 对象 return "([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:抱歉我的英语不好,我希望你能理解我:)
好的,我回来了 post 因为我找到了解决方案:
我创建了一个大师 class,我的 class 继承了这个 class。
这个 super-class 有一个方法名称 getArrayType。
如果我的 children-class 之一需要与我的通用方法一起使用,并且如果她包含一个数组,则它们需要覆盖 getArrayType。
像那样:
override func getArrayType(anyType : Any) -> String {
var className = " "
if(anyType as? NSObject == rows){
className = Properties.PROJECT_NAME + ".SimpleRow"
}
return className
}
我这样调用这个方法(TObject 是我的 super-class):
var className = (objectToIntrospect as TObject).getArrayType(anyType)
var obj: AnyClass! = NSClassFromString(className)
这很完美,但您需要重写一个方法。如果您遇到同样的问题,我希望这对您有所帮助!
我正在编写一个通用方法,该方法采用字典和给定类型的参数来构建对象。
例如,如果您发出获取电影的 SOAP 请求并将响应保存在字典中,您可以:
var movie : Movie = myGenericMethod(dic : Dictionary, objectToIntrospect : Movie()) as Movie
适用于:
- 简单对象
- 复杂对象
但是如果你有一个对象数组,我会遇到问题。 假设您的电影对象包含一个演员数组...
通过反射,我获得了 class 的所有类型的属性。 有了这个,我构建了一个包含我的类型的任何对象的数组。 例如,一个对象包含在其他对象(电影中的演员)中:
//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" 将是一个演员类型,这导致 objectType 是一个演员对象。
但是,如果我有一个数组,我将在处理数组的方法中重定向,我的 objectType return "Swift._NSSwiftArrayImpl" 和我的 anyType 对象 return "([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:抱歉我的英语不好,我希望你能理解我:)
好的,我回来了 post 因为我找到了解决方案: 我创建了一个大师 class,我的 class 继承了这个 class。
这个 super-class 有一个方法名称 getArrayType。
如果我的 children-class 之一需要与我的通用方法一起使用,并且如果她包含一个数组,则它们需要覆盖 getArrayType。
像那样:
override func getArrayType(anyType : Any) -> String {
var className = " "
if(anyType as? NSObject == rows){
className = Properties.PROJECT_NAME + ".SimpleRow"
}
return className
}
我这样调用这个方法(TObject 是我的 super-class):
var className = (objectToIntrospect as TObject).getArrayType(anyType)
var obj: AnyClass! = NSClassFromString(className)
这很完美,但您需要重写一个方法。如果您遇到同样的问题,我希望这对您有所帮助!