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 //雖然不能重寫,但能夠子類也能夠調用
1)OC的selector部分,第一個參數名做爲方法名,而後再括號,括號後的第一個參數名會省略,後面的參數不變ide
//Objective-C [myTableView insertSubview:mySubview atIndex:2]; //Swift myTableView.insertSubview(mySubview, atIndex: 2
2)無參數的方法,仍然必須在方法名後加括號atom
//Swift myTableView.layoutIfNeeded()
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值。
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
在 Objective-C 中,對象的引用能夠是值爲 NULL 的原始指針(一樣也是 Objective- C 中的 nil)。而在 Swift 中,全部的值–包括結構體與對象的引用–都被保證爲非空。並且OC是沒法判斷該值是否爲nil,當在某些情景下,當nil的時候程序會奔潰。而swift中有optional類型,當咱們使用optional的時候,對象或者屬性能夠判斷是否爲空。若是不存在,將會返回nil,而不會奔潰
當比較兩個 Swift 中的對象時,可使用兩種方式。第一種,使用(==),判斷 兩個對象內容是否相同。第二種,使用(===),判斷常量或者變量是否爲同一個對 象的實例。
1)Swift類繼承Objective-C類,系統會自動處理
2)Swift類或Objective-C類想調用對方的類或屬性、方法,對應的類、屬性和方法加上@objc既可
具體能夠百度混編
在 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") } }
都是跟在父類的冒號:後面
class MySwiftViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // 定義類}
1)Swift 的編譯器確保在初始化時,構造器不容許類裏有任何未初始化的屬性
2)Objective-C 語言不一樣,Swift 不 提供單獨的內存分配方法供開發者調用
3)Swift 會將 Objective-C 的初始化方法轉換爲 Swift 的初始化方法。
4)執行額外的清理工做時,執行一個析構過程來代 替dealloc方法。
5)繼承Objective-C類的Swift類會自動加載父類的delloc方法
1)強類型和弱類型 Swift裏屬性默認都是強類型。weak關鍵字修飾弱類型,該關鍵字只能修飾optional類型
2) 讀/寫和只讀 Swift中,沒有readonly和readwrite特性。當聲明一個存儲型屬性時,使用let修飾爲只讀,var爲讀/寫。當聲明一個計算型屬性時,只提供getter爲只讀,提供setter和getter方法爲讀/寫
3)copy特性被轉換爲@NSCopying屬性。必須遵照NSCopying協議
與 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)) }
在選擇器已說明
在 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 }