2015-04-20 12 views
7

Chcę przekonwertować blok na zamknięcie, ale nie mogę dowiedzieć się, jak. Nie wiem, o co chodzi.Konwersja bloku Objective-C do zamknięcia Swift

Objective-C:

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

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

Swift:

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

produkuje błąd:

Error: Cannot assign a value of type '(NSDate, JTCalendar) -> NSString' to a value of type 'JTCalendarMonthBlock!'

Odpowiedz

15

Twoje typy parametrów nie bardzo zgadzają. Można też zrobić:

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

Albo prościej:

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

Zakładam JTCalendar nie jest własne klasy. Jeśli tak, można rozważyć przeprowadzenie audytu, dodając nullability annotations, aby jasno określić, czy parametry te mogą być nil, czy też nie. W przypadku braku tych adnotacji, Swift nie ma możliwości sprawdzenia, czy są one nieinterpretowane, czy nie, więc interpretuje te parametry jako nieopakowane opcje.

Powiązane problemy