【问题标题】:Convert Swift method using extend and append functions to Objective-C使用扩展和附加函数将 Swift 方法转换为 Objective-C
【发布时间】: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


【解决方案1】:

当你这样做时:

[collect addObject:[self serializeObject:nestedObject key:newKey]];

您正在将NSArray 添加到您的collect 对象。相反,您希望将响应中包含的对象添加到collect

[collect addObjectsFromArray:[self serializeObject:nestedObject key:newKey]];

【讨论】:

  • 是的,这是缺少的部分,extend 是 addObjectsFromArray 选择器,我想不通。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多