【问题标题】:Convert Objective-C block to Swift closure将 Objective-C 块转换为 Swift 闭包
【发布时间】:2015-04-20 09:40:00
【问题描述】:

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

目标-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!”类型的值

【问题讨论】:

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


    【解决方案1】:

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

    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,因此它将这些参数解释为隐式展开的可选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多