iOS8开发~Swift 理解?和!

来源:互联网 发布:linux 解压tar 编辑:程序博客网 时间:2024/06/05 17:47
一、概述

在上一篇UI详解中,已经接触了不少的代码,其中有这样的代码实现:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. class AppDelegate: UIResponder, UIApplicationDelegate, UITabBarControllerDelegate {  
  2.                               
  3.     var window: UIWindow?  
  4.   
  5.     func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {  
  6.         self.window = UIWindow(frame: UIScreen.mainScreen().bounds)  
  7.         self.window!.backgroundColor = UIColor.whiteColor()  
  8.         self.window!.makeKeyAndVisible()  
  9.           
  10.         return true  
  11.     }  

现在的问题是: var window: UIWindow? 中的?号如何理解? self.window!.backgroundColor中的!号如何理解?

这一篇详述这个问题。


二、Swift中的?和! 

首先看《The Swift Programming Language》中是这样说的:




意思就是说,类都属性值在使用前必须要初始化,初始化可以以下几种方法:

1、声明属性变量时候直接赋值初始化

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. class CustonObjectA : NSObject {  
  2.     var data: NSArray = []  
  3.     var name: NSString = ""  
  4. }  


2、在构造函数中初始化

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. class CustonObject : NSObject {  
  2.     var data: NSArray  
  3.     var list: <span style="font-family: Arial, Helvetica, sans-serif;">NSArray</span>  
  4.       
  5.     init(data: NSArray, list: NSArray) {  
  6.         self.data = data;  
  7.         self.list = list;  
  8.     }  
  9.       
  10.     deinit {  
  11.     }  
  12. }  


3、声明为optional类型

声明成optional类型很简单,只需要在变量后边加上 ?就可以了

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. class CustonObjectB : NSObject {  
  2.     var data: NSArray?  
  3.     var name: NSString?  
  4. }  

《The Swift Programming Language》中是这样说的:




将变量声明成optional类型,如果变量没有初始化,就会被自动设置成nil没当然Swift中的nil于OC中的不同,Swift中nil上确定一种类型的值,OC中的nil上一个空指针。

optional类型可以看成普通变量的再次包装,既然包装了一次,那使用这个变量的时候就要解开包装,就用!解开。



!符号的使用方法上,如果确认一个optional类型的变量上一个有效的值,那就解包,如果直接!一个变量,如果变量是nil,那就发生错误了。!符号在文档中这么描述的:unwrapped optional 


其实解包不仅仅只有!一种办法,看下面代码,两种解包效果效果是一样的:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. class CustonObjectB : NSObject {  
  2.     var data: NSArray?  
  3.     var name: NSString?  
  4.       
  5.     func customMethod() {  
  6.           
  7.         if (self.data) {  
  8.             let count = self.data!.count  
  9.         } // 第一种 implicitly unwrapped optional  
  10.           
  11.         if let arr = self.data {  
  12.             let countEx = arr.count  
  13.         } // 第二种 implicitly unwrapped optional  
  14.     }  
  15. }  

第二种方法,文档中叫“optional binding”

当然,如果第一种方法中,不加if (self.data) 判断,如果self.data为nil,那就会出错了。


理解了?和!的作用之后,还可以灵活运用:例如官网代码:



由于对官网文档的理解可能不到位,可能对问题的理解有偏差,如果发现错误,还请指正,不胜感激。更多内容请点击这里


0 0
原创粉丝点击