2016-07-25 4 views
-2

блок определяется, как показано нижепочему я должен разворачивать значение, прежде чем я использовать

// Declare block (optional) 
typealias sorting = (([Schedule], [String]) -> [Schedule])? 
    var sortSchedule: sorting = { (schedules, sortDescription) in 
     var array = [Schedule]() 
     for string in sortDescription 
     { 
      for (index, schedule) in schedules.enumerate() 
      { 
       if string == schedule.startTime 
       { 
        array.append(schedule) 
        break 
       } 
      } 
     } 
     return array 
    } 

В некоторых моментах, я вызова блока, выполнив

let allSchedules = sortSchedule?(result, sortDescription()) 
for schedule in allSchedules // Xcode complains at here 
{ 
    .......... 
} 

Im используя ?, потому что я хочу убедитесь, что, если блок существует, тогда сделайте что-нибудь. Однако Xcode жалуется на for петли

value of optional type [Schedule]? not upwrapped, did you mean to use '!' or '?'? 

Im не уверен, почему, потому что возвращаемый тип блока представляет собой массив, который может иметь 0 или более одного изделия.

Кто-нибудь знает, почему xcode жалуется.

+0

Почему я получаю людей с нисходящими потоками? Я хотел бы знать причину этого, чтобы я мог избежать чего-то подобного в будущем. – tonytran

ответ

1

Вы используете ? в строке let allSchedules = sortSchedule?(result, sortDescription()) не «наверняка, что если блок существует», но только для заметки, что вы понимаете, что это может быть nil. За сценой allSchedules есть тип Array<Schedule>?. И вы не можете использовать цикл for in для nil. Лучше использовать опциональное связывание:

if let allSchedules = sortSchedule?(result, sortDescription()) 
{ 
    for schedule in allSchedules 
    { 
     //.......... 
    } 
} 
Смежные вопросы