将Objective-C块转换为Swift闭包

时间:2015-04-20 09:40:00

标签: objective-c swift closures objective-c-blocks

我想将块转换为闭包,但我无法弄清楚如何。我不知道是什么问题。

目标-C:

// monthBlock type
typedef NSString *(^JTCalendarMonthBlock)(NSDate *date, JTCalendar *jt_calendar);

// Block
self.calendar.calendarAppearance.monthBlock = ^NSString *(NSDate *date, JTCalendar *jt_calendar){
    return @"";
};

夫特:

// Swift closure
self.calendar.calendarAppearance.monthBlock = {(date:NSDate, jt_calendar:JTCalendar) -> NSString in
    return "" as NSString
}  

产生错误:

  

错误:无法指定类型的值'(NSDate,JTCalendar) - > NSString'的值为'JTCalendarMonthBlock!'

1 个答案:

答案 0 :(得分:15)

您的参数类型不完全匹配。你可以这样做:

self.calendar.calendarAppearance.monthBlock = { (date: NSDate!, jt_calendar: JTCalendar!) -> String! in
    return ""
}

或者更简单:

calendar.calendarAppearance.monthBlock = { date, jt_calendar in
    return ""
}

我认为JTCalendar不是你自己的班级。如果是,您可以考虑审核它,添加nullability annotations以明确这些参数是否为nil。在没有这些注释的情况下,Swift无法知道这些是否为nullable,因此它将这些参数解释为隐式解包的选项。