【发布时间】:2015-04-30 14:55:29
【问题描述】:
我有一个想要转换为 Objective-C 的 Swift 方法。该方法使用 Array 的 extend 方法,据我了解,它只是在再次调用自身时向数组添加一个对象。
斯威夫特:
///the method to serialized all the objects
func serializeObject(object: AnyObject,key: String?) -> Array<HTTPPair> {
var collect = Array<HTTPPair>()
if let array = object as? Array<AnyObject> {
for nestedValue : AnyObject in array {
collect.extend(self.serializeObject(nestedValue,key: "\(key!)[]"))
}
} else if let dict = object as? Dictionary<String,AnyObject> {
for (nestedKey, nestedObject: AnyObject) in dict {
var newKey = key != nil ? "\(key!)[\(nestedKey)]" : nestedKey
collect.extend(self.serializeObject(nestedObject,key: newKey))
}
} else {
collect.append(HTTPPair(value: object, key: key))
}
return collect
}
到目前为止我在 Objective-C 中所做的事情。
- (NSArray*) serializeObject:(id)obj key:(NSString*)key
{
NSMutableArray* collect = [NSMutableArray array];
if ([obj isKindOfClass:[NSArray class]])
{
NSArray* objArray = obj;
if (obj)
{
for (id nestedObj in objArray)
{
[collect addObject:[self serializeObject:nestedObj key:[NSString stringWithFormat:@"%@[]", key]]];
}
}
}
else if ([obj isKindOfClass:[NSDictionary class]])
{
NSDictionary* dict = obj;
if (dict)
{
for (NSString* nestedKey in dict)
{
NSString* newKey = key != nil ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey;
id nestedObject = [dict objectForKey:newKey];
if (nestedObject)
{
[collect addObject:[self serializeObject:nestedObject key:newKey]];
}
}
}
}
else
{
[collect addObject:[[WEEHTTPPair alloc] initWithValue:obj andKey:key]];
}
return collect;
}
目标是为字典中的每个键/值对获取 WEEHTTPPair 对象的 NSArray,但我失去了扩展和附加的含义,以便在我的 Objective-C 代码中应用。对我来说,看起来两者都将对象添加到无论如何都是新创建的数组中,但到目前为止我还缺乏知识。
[编辑]
相应地使用方法。
斯威夫特。
///convert the parameter dict to its HTTP string representation
func stringFromParameters(parameters: Dictionary<String,AnyObject>) -> String {
return join("&", map(serializeObject(parameters, key: nil), {(pair) in
return pair.stringValue()
}))
}
我转换为 Objective-C 借用了BlockKits 地图扩展。
目标-C。
- (NSString*) stringFromParameters:(NSDictionary*)parameters
{
WEENSArrayBlocksKit* blockKit = [WEENSArrayBlocksKit new];
NSArray* serializedParams = [self serializeObject:parameters key:nil];
NSArray* arrayParams = [blockKit bk_map:serializedParams withBlock:^id(id obj)
{
// obj is an array without the desired results
WEEHTTPPair* httpPair = obj;
NSString* stringValue = nil;
if (httpPair)
{
stringValue = [httpPair stringValue];
}
return stringValue;
}];
NSString* joinedString = [arrayParams componentsJoinedByString:@"&"];
return joinedString;
}
【问题讨论】:
-
对我来说它看起来非常简单。您认为缺少什么?
-
我用问题的更多信息编辑了问题。我正在等待 WEEHTTPPair 的 NSArray,而不是得到一个包含 NSArray 的 NSArray?!仍在尝试调试原因。
标签: ios objective-c arrays swift