为什么我必须在使用前解开价值

why I have to unwrap value before I use

块定义如下

 // 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
 {
    ..........
 }

我使用 ? 是因为我想确保如果该块存在,则执行某些操作。但是,Xcode 抱怨 for 循环

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

我不确定为什么,因为块的 return 类型是一个数组,可以有 0 个或多个项目。

有谁知道 xcode 为什么抱怨。

您在行 let allSchedules = sortSchedule?(result, sortDescription()) 中使用 ? 而不是 "for sure that if the block exists",但请注意,您明白它可以是 nil。在幕后 allSchedules 有类型 Array<Schedule>?。而且你不能使用 for in 循环 nil。您最好使用可选绑定:

if let allSchedules = sortSchedule?(result, sortDescription())
{
    for schedule in allSchedules
    {
       //..........
    }
}