Swift中的问号?和感叹号!
本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错: varstringValue:String//error:variable'stringValue'usedbeforebeinginitialized//lethashValue=stringValue.hashValue//^lethashValue=stringValue.hashValue 上面了解到的是普通值,接下来Optional值要上场了。经喵神提醒,Optional其实是个 enumOptional<T>:LogicValue,Reflectable{ caseNone caseSome(T) init() init(_some:T) ///AllowuseinaBooleancontext. funcgetLogicValue()->Bool ///Haskell'sfmap,whichwasmis-named funcmap<U>(f:(T)->U)->U? funcgetMirror()->Mirror} 声明为Optional只需要在类型后面紧跟一个 varstrValue:String?//?相当于下面这种写法的语法糖varstrValue:Optional<Int> 一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断: ifstrValue{ //dosthwithstrValue} 然后怎么使用Optional值呢?文档中也有提到说,在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个 lethashValue=strValue?.hashValue strValue是Optional的字符串,如果strValue是nil,则hashValue也为nil,如果strValue不为nil,hashValue就是strValue字符串的哈希值
另外,对于Optional值,不能直接进行操作,否则会报错: //error:'String?'doesnothaveamembernamed'hashValue'//lethashValue=strValue.hashValue//^~~~~~~~~~lethashValue=strValue.hashValue 上面提到Optional值需要拆包(unwrap)后才能得到原来值,然后才能对其操作,那怎么来拆包呢?拆包提到了几种方法,一种是 ifletstr=strValue{ lethashValue=str.hashValue} 还有一种是在具体的操作前添加 直接上例子,strValue是Optional的String: lethashValue=strValue!.hashValue 这里的 ifstrValue{ lethashValue=strValue!.hashValue} {}里的strValue一定是非nil的,所以就能直接加上!,强制拆包(unwrap)并执行后面的操作。 当然如果不加判断,strValue不小心为nil的话,就会出错,crash掉。 考虑下这一种情况,我们有一个自定义的 myLabel!.text="text"myLabel!.frame=CGRectMake(0,10,10)... 对于这种类型的值,我们可以直接这么声明: varmyLabel:UILabel!//!相当于下面这种写法的语法糖varmyLabel:ImplicitlyUnwrappedOptional<UILabel>
Swift是门新生的语言,我们有幸见证了它的诞生,激动之余也在佩服苹果大刀阔斧的推出一个新的语言替代一个已经比较成熟语言的魄力,今天在知乎日报上看到一个回答是说Swift是一门玩具语言,正当想去吐槽,发现回答已经被删除了。个人认为苹果是很认真的推出Swift的,从Swift的各种细微的设计也能看的出来。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |