首页 > 编程语言 > 详细

《Using Swift with Cocoa and Objective-C》总结

时间:2015-10-29 18:36:25      阅读:347      评论:0      收藏:0      [点我收藏+]

一 互用性

1.初始化

  1)在OC中,初始化往往会有init、initWith字眼,但在swif却在这里都省略了,连分配内存的alloc,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的方式被调用的。虽然不能重写,但可以子类也可以调用

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部分,第一个参数名作为方法名,然后再括号,括号后的第一个参数名会省略,后面的参数不变

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

2)无参数的方法,仍然必须在方法名后加括号

//Swift
myTableView.layoutIfNeeded()

3.id/AnyObject

        Swift 包含一个叫做AnyObject的协议类型,表示任意类型的对象,就像 Objective-C 中的id一样。

   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 类型的对象转换成明确的类型并不会保证成功,所以它会返回一个可选的值。而你需通过检查该值的类型来确认转换是否成功。

   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 中的对象时,可以使用两种方式。第一种,使用(==),判断 两个对象内容是否相同。第二种,使用(===),判断常量或者变量是否为同一个对 象的实例。









《Using Swift with Cocoa and Objective-C》总结

原文:http://my.oschina.net/u/2346786/blog/523624

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!