《Using Swift with Cocoa and Objective-C》總結

 互用性

1>與Objective-C API交互

1.初始化

  1)在OC中,初始化每每會有init、initWith字眼,但在swif卻在這裏都省略了,連分配內存的alloc,swift也會自動幫咱們處理。swift

//Objective-C
UITableView *myTableView = [[UITableView alloc]
initWithFrame:CGRectZero style:UITableViewStyleGrouped];					
				
//Swift
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

  2)在初始化的時候,咱們甚至能夠忽略對象類型。設計模式

let myTextField = UITextField(frame: CGRect(x: 50, y: 50, width: 200, height: 39))

 3)關鍵字convenience安全

       這類方法是Swift初始化方法中的「二等公民」,只做爲補充和提供使用上的方便。全部的convenience初始化方法都必須調用同一個類中的designated初始化完成設置,另外convenience的初始化方法是不能被子類重寫或從子類中以super的方式被調用的。雖然不能重寫,但能夠子類也能夠調用app

class ClassA {  
    let numA: Int  
    init(num: Int) {  
        numA = num  
    }  
    convenience init(bigNum: Bool) {  
        self.init(num: bigNum ? 10000 : 1)   //補充init(num: Int)初始化方法。
    }  
}

class ClassB: ClassA {  
    let numB: Int  
    override init(num: Int) {  
        numB = num + 1  
        super.init(num: num)  
    }  
}

let anObj = ClassB(bigNum: true)  
// anObj.numA = 10000, anObj.numB = 10001 //雖然不能重寫,但能夠子類也能夠調用

2.方法

 1)OC的selector部分,第一個參數名做爲方法名,而後再括號,括號後的第一個參數名會省略,後面的參數不變ide

//Objective-C
[myTableView insertSubview:mySubview atIndex:2];
        
//Swift
myTableView.insertSubview(mySubview, atIndex: 2

2)無參數的方法,仍然必須在方法名後加括號atom

//Swift
myTableView.layoutIfNeeded()

3.id/AnyObject

        Swift 包含一個叫作AnyObject的協議類型,表示任意類型的對象,就像 Objective-C 中的id同樣。spa

   1)跟 id 同樣,你能夠爲AnyObject類型的對象分配任何其餘類型的對象,你也一樣能夠爲它從新分配其餘類型的對象。設計

var myObject:AnyObject = UITableViewCell()
myObject = NSDate()

   2)配合optional類型使用指針

//Swift
let futureDate = myObject.dateByAddingTimeInterval(10)
let timeSinceNow = myObject.timeIntervalSinceNow

myObject.characterAtIndex(5)

由於NSDate無characterAtIndex這個方法,因此會報錯。但咱們能夠添加爲characterAtIndex屬性添加?。
當myObject.characterAtIndex(5)不存在或無值的時候,程序不會奔潰,而會返回nil值。

4)強制轉換 as!/as?

    as?   對於 Swift 中的強制類型轉換,從 AnyObject 類型的對象轉換成明確的類型並不會保證成功,因此它會返回一個可選的值。而你需經過檢查該值的類型來確認轉換是否成功。code

   as!  若是你能肯定這個對象的類型(而且肯定不是 nil)

let userDefaults = NSUserDefaults.standardUserDefaults()
let lastRefreshDate: AnyObject? = userDefaults.objectForKey("LastRefreshDate")
if let date = lastRefreshDate as? NSDate { 
    print("\(date.timeIntervalSinceReferenceDate)")
}
        
        
let myDate = lastRefreshDate as! NSDate    //Error:lastRefreshDate is nil
let timeInterval = myDate.timeIntervalSinceReferenceDate

5)使用nil

  在 Objective-C 中,對象的引用能夠是值爲 NULL 的原始指針(一樣也是 Objective- C 中的 nil)。而在 Swift 中,全部的值–包括結構體與對象的引用–都被保證爲非空。並且OC是沒法判斷該值是否爲nil,當在某些情景下,當nil的時候程序會奔潰。而swift中有optional類型,當咱們使用optional的時候,對象或者屬性能夠判斷是否爲空。若是不存在,將會返回nil,而不會奔潰

6)比較對象

  當比較兩個 Swift 中的對象時,可使用兩種方式。第一種,使用(==),判斷 兩個對象內容是否相同。第二種,使用(===),判斷常量或者變量是否爲同一個對 象的實例。

7)Objective-C與Swift混編

  1)Swift類繼承Objective-C類,系統會自動處理

  2)Swift類或Objective-C類想調用對方的類或屬性、方法,對應的類、屬性和方法加上@objc既可

  具體能夠百度混編

8)Selectors選擇權

    在 Swift 時代, Objective-C 的選擇器被Selector結構體替代。你能夠經過字符串建立一個選擇 器

好比 let mySelector: Selector = "tappedButton:"。由於字符串可以自動轉換爲選擇器,因此你能夠把字符串直接傳遞給接受選擇器的方法。

    //Swift
    import UIKit
    class MyViewController: UIViewController {
        let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
        init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
    
        super.init(nibName: nibName, bundle: nibBundle)
        myButton.targetForAction("tappedButton:", withSender: self)//傳入方法名的字符串類型
        }
        
        func tappedButton(sender: UIButton!) {
        println("tapped button")
        }
    }


1.2>使用Objecitve-C特性編寫Swift類

1.繼承Objective-C的類和使用協議

都是跟在父類的冒號:後面

class MySwiftViewController: UIViewController, UITableViewDelegate,
UITableViewDataSource {						
// 定義類} 

2.編寫構造器和析構器

1)Swift 的編譯器確保在初始化時,構造器不容許類裏有任何未初始化的屬性

 2)Objective-C 語言不一樣,Swift 不 提供單獨的內存分配方法供開發者調用

 3)Swift 會將 Objective-C 的初始化方法轉換爲 Swift 的初始化方法。

 4)執行額外的清理工做時,執行一個析構過程來代 替dealloc方法。

5)繼承Objective-C類的Swift類會自動加載父類的delloc方法

3.屬性特性

1)強類型和弱類型 Swift裏屬性默認都是強類型。weak關鍵字修飾弱類型,該關鍵字只能修飾optional類型

2) 讀/寫和只讀    Swift中,沒有readonly和readwrite特性。當聲明一個存儲型屬性時,使用let修飾爲只讀,var爲讀/寫。當聲明一個計算型屬性時,只提供getter爲只讀,提供setter和getter方法爲讀/寫

3)copy特性被轉換爲@NSCopying屬性。必須遵照NSCopying協議


1.3>採用Cocoa設計模式

1.委託

    與 Objective-C 相比,當你在 Swift 中繼承一個委託時,雖然繼承模式不變,可是內部的實現已經改變了。在 Objective-C 中,在你向委託發送消息以前,無論它是否是 nil 你都會去查看,若是定義的方法是非必須實現的 方法,無論委託有沒有實現這個方法,你也都會去查看。而在 Swift 中,經過保持類型安全的特性,並且訪問特定的方法。

 Objective-C
  @inteface MyObject : NSObject
  property (nonatomic, weak) id<NSWindowDelegate> delegate;
  @end
 
 swift
 if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize:
     mySize) {
     println(NSStringFromSize(fullScreenSize))
 }

2.延遲初始化

3.錯誤報告

4.鍵值觀察

5.Taget-Action模式

   在選擇器已說明

6.類型匹配與同一規範

     在 Objective-C 中,你可使用 isKindOfClass: 方法檢查某個對象是不是指定類 型,可使用 conformsToProtocol: 方法檢查某個對象是否遵循特定協議的規範。在 Swift 中,你可使用 is 運算符完成上述的功能,或者也可使用 as? 向下匹配 指定類型。   

//使用 is 運算符檢查一個實例是不是指定的子類。
if object is UIButton {
    // object is of type UIButton					
} else {
    // object is not of type UIButton					
}

//使用 as? 向下匹配指定類型。
let myButton = object as? UIButton {
    // object is successfully cast to type UIButton and bound to button
					
} else {
    // object could not be cast to type UIButton
					
} 

//檢查匹配協議的語法與檢查匹配類的語法是同樣的,下面是使用as?檢查匹配協議			
if let dataSource = object as? UITableViewDataSource {
// object conforms to UITableViewDataSource and is bound to dataSource		
} else {
    // object not conform to UITableViewDataSource					
} 			 
相關文章
相關標籤/搜索