目录
前言
当我们开始接触一门新语言时,我们难免避免不了类型和基本语法规则。我们会急切的想知道如何用新的语法规则写我们原先所熟知的语句。本文旨在对于Object-C和Swift做一些基本的对比。通过阅读本文,您能快速的了解Swift3.0和Object-C的一些差别。
基本类型
同所有的面向对象语言一样,Swift里也只有两种类型:1.值类型
2.引用类型值类型包括struct,enum;
引用类型主要是class,嗯还有闭包也是引用类型哦。代码不再需要分号结尾
Swift代码单行结束,不需要强制加分号,但也可以选择加
类型推断
Swift可以自动根据上下文为一个变量推断出其类型;
强类型语言
尽管Swift可以支持类型推断,可以用var来声明变量。但Swift是强类型语言。这样意味着,只要涉及不同类型之间的运算,都需要进行强制类型转换
变量、常量定义
let constant name : type = expression
var variable name : type = expression
在开始所有介绍前,我们先看简单的几行代码.大家采一些预期结果是什么?
var num=3.0
var integer=6
print(num+integer) //输出结果是?
结果:编译不过。因为Swift是一个强类型语言
从Object-C向Swift过渡
接下来将会从Protocol,block,GCD等大家在Object-C里熟知的内容开始,一步步过渡到Swift3.0。
**1.protocol
2.block
3.GCD
4.property
5.函数
6.extension,category
7.可选类型?与??
8.类型判断与转换
9.id类型与Any,AnyObject,nil
10.typedef与typealias
11.宏定义
12.混合编程
13.API设计与函数命名对比**
1.protocol
Swift也和OC一样有protocol,但不同的是Swift的protocol可以被class,struct,enum实现,甚至还能进行extension扩展。
参考:Protocols
- Protocol以及optional protocol定义
//Object-C
@protocol RefreshHeaderDelegate <NSObject>
@optional
- (void)willBeginRefresh:(PullRefreshHeader*)header;
- (void)didRefresh:(PullRefreshHeader*)header;
@required
- (void)didFinishRefresh:(PullRefreshHeader*)header;
@end
//Swift
@objc protocol RefreshHeaderDelegate {
@objc optional func willBeginRefresh(header:PullRefreshHeader) -> Void
@objc optional func didRefresh(header:PullRefreshHeader) -> Void
}
//加了class的protocol才能被使用在类的delegate模式中,因为protocol不加class标记则还可以被enum,struct实现
protocol RefreshHeaderDelegate :class{
func willBeginRefresh(header:PullRefreshHeader) -> Void
func didRefresh(header:PullRefreshHeader) -> Void
}
- 定义了optional方法后,如何判断delegate是否实现了该方法?
//Object-C
if([self.delegate respondsToSelector:@selector(willBeginRefresh:)]){
//执行delegate的方法
[self.delegate willBeginRefresh:self];
}
//Swift中我们可以更优雅的实现,optional是很方便的
self.delegate?.willBeginRefresh?(header: self)
2.block
Swift中任何两个{}之间的代码都算是闭包,因此函数也是一种特殊的闭包。
参考:closure-expressions-in-swift
- 闭包定义
//Swift闭包定义
{ (obj:AnyObject) ->Void in
//闭包内容开始
print(obj)
pring($0)
//可以用$<index>来指向闭包的形参,下标从0开始
}
- 如何避免闭包中的循环引用?
//Object-C
__weak __typeof(self) __weak_self = self
[button onClicked:^(MttTopBannerButton * button) {
MttBottomBanner *banner=[[MttBottomBanner alloc] init];
[__weak_self.view addSubview:banner];
[banner show];
button.hidden=YES;
}];
//Swift更优雅
button.onClicked({
[weak self]
(button:MttTopBannerButton) ->Void in
var banner = MttBottomBanner()
self?.view.addSubview(banner)
banner.show()
button.hidden=true
})
- weakself,strongself
//Swift
DispatchQueue.main.sync(execute: {
[weak self]
(_:AnyObject?) ->Void in
self?.draw()
self?.color=UIColor.white()
DispatchQueue.main.sync(execute: {
if let strongSelf=self {