在Swift中使用closure作为唯一参数初始化对象

时间:2015-08-05 10:54:06

标签: ios swift cocoa

我有一个来自我的Obj-C pod的自动生成的swift类,如下所示:

typealias BlockDomainMapperMappingBlock = (AnyObject!) -> AnyObject!

class BlockDomainMapper : DomainMapper {

    var mappingBlock: BlockDomainMapperMappingBlock! { get }

    /*not inherited*/ init!(block: BlockDomainMapperMappingBlock!)
}

尝试初始化对象时:

let domainMapper = BlockDomainMapper { (objectToMap : AnyObject!) -> AnyObject! in
   return LoginCredentials(token: objectToMap)
}

我收到以下错误:

  

无法找到接受的“BlockDomainMapper”类型的初始值设定项   一个类型'((AnyObject!) - > AnyObject!)'

的参数列表

这令我感到困惑,因为我在X-Code中使用自动完成来生成大部分代码((objectToMap:AnyObject!),它以AnyObject!占位符开头。)

编辑:这是生成swift类的Objective-C代码:

typedef id (^BlockDomainMapperMappingBlock)(id dataToMap);

@interface BlockDomainMapper : GLTDomainMapper

@property (nonatomic, readonly, copy) BlockDomainMapperMappingBlock mappingBlock;

+ (BlockDomainMapper *)mapperWithBlock:(BlockDomainMapperMappingBlock)block;

@end
编辑2:哇!在再次查看Obj-c代码之后,我认为它会破坏mapperWithBlock转换,或者我使用错误的语法来调用那种类方法。

3 个答案:

答案 0 :(得分:0)

尝试:

let domainMapper = BlockDomainMapper() { (objectToMap : AnyObject!)

(即在BlockDomainManager()之后包括()

答案 1 :(得分:0)

在我看来,你从一个"类工厂开始的Objective-C代码"方便方法[Type1 Vol1] = blood_type(1, 'Ann'); [Type2 Vol2] = blood_type(2, 'Ben'); [Type3 Vol3] = blood_type(3, 'Chris'); [Type4 Vol4] = blood_type(4, 'David'); 用于创建mapperWithBlock:个对象。这与初始化程序不同。它使用初始化程序。

您的初始化程序相当于Objective-C调用BlockDomainMapper

如果要调用初始化程序,则需要添加参数标签:

+initWithBlock:

应该工作。

(我还在学习Swift的细节,所以我并非100%肯定,但我认为这是你需要做的。)

答案 2 :(得分:0)

我现在知道自己做错了什么。这里有一些有效的代码。

let domainMapper = BlockDomainMapper { (objectToMap : AnyObject!) -> AnyObject! in
   return LoginCredentials(token: objectToMap as! String)
}