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

时间:2016-07-25 14:29:03

标签: ios swift optional forced-unwrapping

块定义如下

 // 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 '?'?

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

有谁知道为什么xcode会抱怨。

1 个答案:

答案 0 :(得分:1)

您在行?中使用let allSchedules = sortSchedule?(result, sortDescription())而不是“确定如果该块存在”,但只是为了注意,您了解它可以是nil。场景allSchedules后面的类型为Array<Schedule>?。并且您不能将for in周期用于nil。您最好使用可选绑定:

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