2017-10-06 52 views
1

我有一个需要转换为整数数组的字符串数组。For Case中的可选语句

import Foundation 

let strings = ["One", "2", "Three", "4", "Five", "6"] 

let integers = strings.map{Int($0)} 

// :Using Optional Binding in a FOR Case Statement 
for case let val? in integers { 
    print("\(val)") 
} 

在上面的For Case语句中,我们使用[Int?]数组中的Optional值进行模式匹配。我对这个概念的理解是,由于数组是一个可选的int数组,因此返回的值在使用它们之前必须先展开,但是我们在For Case语句中使用可选绑定,因此值将解包到变量“val ”。但变量“val”本身似乎是一个可选变量,这意味着该值需要在print语句中再次解包,但是会给出错误:“不能强制展开非可选类型'Int'的值”,这意味着那“val”不是一个可选变量。

这真是令人困惑。有人可以解释为什么变量“val”不是一个可选变量,当我们使用“?”时用它 !!

谢谢, Ujj​​wal

回答

2

val?是 “可选模式” 和用于.some(val)的快捷方式。 如果该表达式不是nil, ,则匹配可选表达式,然后将val绑定到解包的匹配表达式的值。

Optional Patterns

An optional pattern matches values wrapped in a some(Wrapped) case of an Optional<Wrapped> enumeration. Optional patterns consist of an identifier pattern followed immediately by a question mark and appear in the same places as enumeration case patterns.

因此val是一个非可选Int,你观察到。

0

当您使用for case时,您有条件地迭代集合。它只会迭代和处理与模式匹配的元素。如果您描述的是val?换句话说就是optional