Men的博客

欢迎光临!

0%

Swift和OC的区别

初始化

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

可失败初始化

if let image = UIImage(contentsOfFile: “MyImage.png”) {
// loaded the image successfully
} else {
// could not load the image
}

访问属性方法

在 Swift 中访问和设置 Objective-C 对象的属性时,使用点语法

id 兼容性(id Compatibility)

Swift 包含一个叫做AnyObject的协议类型,表示任意类型的对象,就像 Objective-C 中的id一样。AnyObject协议允许你编写类型安全的 Swift 代码同时维持无类型对象的灵活性。因为AnyObject协议保证了这种安全,Swift 将id对象导入为AnyObject。
对于 Swift 中的强制类型转换,从AnyObject类型的对象转换成明确的类型并不会保证成功,所以它会返回一个可选的值。而你需通过检查该值的类型来确认转换是否成功。
//Swift
let userDefaults = NSUserDefaults.standardUserDefaults()
let lastRefreshDate: AnyObject? = userDefaults.objectForKey(“LastRefreshDate”)
if let date = lastRefreshDate as? NSDate {
println(“(date.timeIntervalSinceReferenceDate)”)
}
当然,如果你能确定这个对象的类型(并且确定不是nil),你可以添加as操作符强制调用。

let myDate = lastRefreshDate as NSDate
let timeInterval = myDate.timeIntervalSinceReferenceDate

扩展(Extensions)

你也可以使用扩展来增加属性(包括类的属性与静态属性)。然而,这些属性必须是通过计算才能获取的,扩展不会为类,结构体,枚举添加存储属性。下面这个例子为CGRect类增加了一个叫area的属性。
//Swift
extension CGRect {
var area: CGFloat {
return width * height
}
}
let rect = CGRect(x: 0.0, y: 0.0, width: 10.0, height: 50.0)
let area = rect.area
// area: CGFloat = 500.0

比较对象

当比较两个 Swift 中的对象时,可以使用两种方式。第一种,使用(==),判断两个对象内容是否相同。第二种,使用(===),判断常量或者变量是否为同一个对象的实例。

Swift 与 Objective-C 一般使用 == 与 === 操作符来做比较。Swift 的 == 操作符为源自 NSObject 的对象提供了默认的实现。在实现 == 操作符时,Swift 调用 NSObject 定义的 isEqual: 方法。
Swift 类型兼容性
当你在 Swift 中创建了一个继承自 Objective-C 类的子类时,该类以及该类的成员-属性,方法,下标和构造器,便会在 Objective-C 中自动可用。在某些情况下,你需要更细粒度的控制如何将 Swift API 暴漏给 Objective-C。如果你的 Swift 类没有继承自 Objective-C 的类,又或者你想更改暴漏给 Objective-C 代码的接口符号名称,你便可以使用@objc属性。如果你正在使用如键值观察的 API 来动态替换方法的实现,也可以通过使用dynamic修饰符来获得对 Objective-C 运行时被自动派发的成员的访问。

轻量级泛型
使用轻量级泛型参数的 Objective-C 声明类型,如NSArray,NSSet以及NSDictionary,在被导入到 Swift 时会附带上他们内容保存的类型。

例如,考虑下面的 Objective-C 属性声明:

@property NSArray<NSDate > dates;
@property NSSet<NSString > words;
@property NSDictionary<KeyType: NSURL , NSData *> cachedData;
下面是 Swift 导入后:

var dates: [NSDate]
var words: Set
var cachedData: [NSURL: NSData]

参考资料
http://www.jianshu.com/p/4a1978845eac?utm_campaign=hugo&utm_medium=reader_share&utm_content=note