Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,
也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化
。如果在使用变量之前不进行初始化就会报错:
[plain] view plain copy print ? varstringValue:String //error:variable'stringValue'usedbeforebeinginitialized //lethashValue=stringValue.hashValue //^ lethashValue=stringValue.hashValue
出错的原因就是在使用stringValue这个变量之前,没有初始化这个变量,也就是这个变量根本就没有得到内存,
这时就会出错。
那么我们可以使用optional类型,后面跟一个?就是了。
copy //这就是optional,strValue自动得到默认值:nil //这个nil跟Objective-C中的nil不同,不是指针,而是表示值不存在。 varstrValue:String? //判断optional是否有值 ifstrValue{ //dowhatyouneedtodohere }
copy //optionalbinding //如果strValue==nil,那么结果就是nil,不会调用String的hasValue //如果strValue!=nil,就返回strValue对应的hashValue值并赋值给常量hashValue iflethashValue=strValue?.hashValue{ //dosomethingifneccessary }
在写协议(protocol)时,对于可选代理方法,也需要在调用时在函数名后跟着?,如:
copy //@objc是用于处理Swift与OC之间的转换的,由于@optional是OC中的关键字, //所以在protocol之前需要添加上@objc。 @objcprotocolHttpRequestDelegate{ //@optional说明这个代理方法是可选方法, //那么在调用的时候,需要这样调用:delegate?.requestFinished?(self,downloadData) //其中delegate?是因为delegate也是optional的 @optionalfuncrequestFinished(request:HttpRequest!,downloadData:NSMutableData!) //otherfuncs... } vardelegate:HttpRequestDelegate? vardownloadData=NSMutableData() delegate.requestFinished(self,downloadData) 当然我们也可以使用!来强制拆包,这是我们在保证有值的情况下才会这么用: 使用!来声明变量,会成为隐式强拆包可选类型,这表示这个类型永远不会出现nil的情况,但一旦出来, 在调用时就会崩溃。 copy //ImplicitlyUnwrappedOptionals //使用这种方式声明的话,在调用时不需要使用?或!来说明。 varmyLabel:UILabel! myLabel=UILabel(frame:CGRectMake(10,100,300,10)) myLabel.text="label" 通常在什么情况下才会使用optional类型呢? (1)当我们需要声明这样一个变量,变量在设计初始化函数中没有进行初始化时,就需要声明这个变量为optional类型。因为变量在使用前必须先 声明,并且在设计初始化函数中进行初始化。比如我们在vIEwDIDLoad函数中才进行初始化的控件(类成员),就需要声明为optional且必须是var声明, 因为let声明的常量只能是在初始化函数中进行初始化。 (2)当我们不知道是否会有值的时候,这个变量可以声明为optional,比如代理,我们并没有要求必须传代理过来,那么就需要声明为optional。 (3)作为函数参数时,如果这个参数可以没有值,那么就使用optional类型,比如传代理的时候,通常就是可选的,可以设置为nil ......暂时只想到这些,任何人都可以继续往下补充! 本文转自:http://blog.csdn.net/woaifen3344/article/details/30244201 以上是内存溢出为你收集整理的Swift 学习之二十一:?和 !(详解)全部内容,希望文章能够帮你解决Swift 学习之二十一:?和 !(详解)所遇到的程序开发问题。 如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。 欢迎分享,转载请注明来源:内存溢出
隐式强拆包类型:
总结:
评论列表(0条)