更新时间:2018-09-25 15:47作者:李一老师
问题3–Swift1.0orlater
下面的代码输出是什么?并说明理由。
varthing="cars"
letclosure={[thing]in
print("Ilove\(thing)")
}
thing="airplanes"
closure()
答案:输出的是:Ilovecars。当闭包被声明的时候,抓捕列表就复制一份thing变量,所以被捕捉的值并没有改变,即使你给thing赋了一个新值。
如果你要忽视闭包中捕捉列表的值,那么编译器引用那个值而不是复制。这种情况下,被引用变量的值的变化将会反映到闭包中,正如下面的代码所示:
varthing="cars"
letclosure={
print("Ilove\(thing)")
}
thing="airplanes"
closure()//Prints"Iloveairplanes"
问题4–Swift2.0orlater
下面是一个全局函数,这个函数的功能是计算数组中特殊值得个数。(待校验)
funccountUniques(array:Array)->Int{
letsorted=array.sort(<)
letinitial:(T?,Int)=(.None,0)
letreduced=sorted.reduce(initial){($1,$0.0==$1?$0.1:$0.1+1)}
returnreduced.1
}
它使用了<和==运算符,他们限制着T(占位类型)的实际类型,也就是说T必须遵循Comparable协议。你可以这样使用它:
countUniques([1,2,3,3])//resultis3
现在要求你重写上面的方法作为Array的扩展方法,然后你就可以这样写代码:
[1,2,3,3].countUniques()//shouldprint3