swift3 与 OC 语法区别
1、Swift还增加了Objective-C中没有的类型比如元组(Tuple)。
元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。
元组(tuples)把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型。
//可以通过下标来访问元组中的单个元素
let http404Error =(,"Not Found")
println("The status code is \(http404Error.0)")
//给元组中的元素命名后,你可以通过名字来获取这些元素的值
let http200Status =(statusCode: ,description: "OK")
println("The status code is \(http200Status.statusCode)")
注意:元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。
2、Swift还增加了可选(Optional)类型,用于处理值缺失的情况。
Swift定义的常量和变量是没有默认值的,所以引入了可选的概念,用?修饰变量,标示该变量的值可能为空也可能为某个值,然后获取的时候用!强制解析,此时必须有值,否则报运行时错误。
3、常量的值一旦设定就不能改变,而变量的值可以随意更改。常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。所谓改变,对于基本数据类型而言,值改变就是改变,而对于引用数据类型而言,指针指向改变才是改变。
4、类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用typealias关键字来定义类型别名。
5、属性监视器
willSet在设置新的值之前调用
didSet在新的值被设置之后立即调用
6、继承
如果子类实现和父类相同的方法或者属性就是重写。必须用override关键字表明。
防止重写,你可以通过把方法,属性或附属脚本标记为final来防止它们被重写。
7、构造方法
与Objective-C中的构造器不同,Swift的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。
构造器分为指定构造器和便利构造器,原则:指定构造器是向上调用的,便利构造器是横向调用的。
规则1:指定构造器必须调用其父类的指定构造器
规则2:便利构造器必须调用同一类中调用的其他构造器
规则3:便利构造器必须以调用一个指定构造器结束
//指定构造器(默认构造方法),因为父类也有该方法,所以用override override init() {
super.init()
print("Student init")
} //指定构造器(自定义构造方法,父类没有该方法,不需要override)
init(size:Double) {
super.init(size: size)
print("Student init with size")
} //便利构造器(使用关键词convenience,需要调用自己的构造方法)
convenience init(size:Double,friendNums:Double){
self.init(size:size)
self.friendNums = friendNums
}
8、类扩展,相当于OC分类
添加计算型属性和计算静态属性
注意:扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器(property observers)
定义实例方法和类型方法
提供新的构造器
定义下标
定义和使用新的嵌套类型
使一个已有类型符合某个接口
9、循环引用的问题
使用弱引用weak和无主引用unowned修饰一方变量。
两个属性的值都可能是nil,并有可能产生强引用环。这种场景下适合使用弱引用。
var a:A?
weak b:B?
一个属性可以是nil,另外一个属性不允许是nil,并有可能产生强引用环。这种场景下适合使用无主引用。
var a:A?
unowned b:B
override init(){
self.b = B()
}
两个属性都必须有值,且初始化完成后不能为nil。这种场景下,则要一个类用无主引用属性,另一个类用隐式展开的可选属性。
var a:A!
override init(){
self.a = A()
} unowned b:B
override init(){
self.b = B()
}
在oc中,我们需要在代码块用到self时,可以直接把self付给其他变量,然后在块中使用完毕后制空,或者像下面弱引用self来避免循环引用:
__weak typeof(self) weakSelf = self;
在swift中
//这里用gcd举例不好,毕竟系统的块不会造成循环引用,这里就勉强的学一下怎么改吧
dispatch_async(dispatch_get_global_queue(, )) {[unowned self] () -> Void in
self.view
//添加自己的代码
}
10、检查类型
用类型检查操作符(is)来检查一个实例是否属于特定子类型。
某类型的一个常量或变量可能在幕后实际上属于一个子类。你可以相信,上面就是这种情况。你可以尝试向下转到它的子类型,用类型转换操作符(as)
如果强制转型肯定成功,可以使用as!,如果使用as?,那么返回结果成功则为该转的类型,失败则为空,此时可以使用if let来接收判断。
11、AnyObject
AnyObject类似于OC中的id类型,表示任意的class的实例对象,但是在Swift中,例如我们常见的String和Array都变为结构体了,而且在Swift3.0中,更多的类型或者枚举被写为结构体了,AnyObject的适用范围变相被削弱了,所以在Swift3.0的API中曾经许多AnyOjbect的类型被替换为Any了。
AnyObject的自动类型转换
OC的NSArray
里面只能保存对象类型, 不能添加基本数据类型,如枚举、结构体等.
Swfit里面将Array的元素类型声明成 AnyObject,
swift会自动将基本数据类型123转换为NSNumber
对象类型。
let array = ["",]
Any 可以表示任何类型,包括函数类型、基本数据类型。
let a:[Any] = ["",]
AnyClass: 表示任意类的元类型.任意类的类型都隐式遵守这个协议.
public typealias AnyClass = AnyObject.Type
12、闭包
Swift中的闭包与C和Objective-C中的blocks有点类似。
闭包表达式语法
{(parameters)-> returnType in
statements
}
13、在swif中的互斥锁
- oc中的互斥锁:
@synchronized(self) {
//需要执行的代码块
}
- swift中的互斥锁
objc_sync_enter(self)
//需要执行的代码块
objc_sync_exit(self)
swift3 与 OC 语法区别的更多相关文章
- C++与Java的语法区别
C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...
- 关于OC语法的公开和私有的讨论
关于OC语法的公开和私有的讨论 OC语法中,类的.h文件向外面暴露类的功能/方法接口,其中定义的属性/方法/协议/类别/类扩展都属于公开的,但实例变量要看限定词(@protected/@public/ ...
- Python2和Python3的一些语法区别
Python2和Python3的一些语法区别 python 1.print 在版本2的使用方法是: print 'this is version 2 也可以是 print('this is versi ...
- python2 与 python3 语法区别
python2 与 python3 语法区别 概述# 原稿地址:使用 2to3 将代码移植到 Python 3 几乎所有的Python 2程序都需要一些修改才能正常地运行在Python 3的环境下.为 ...
- MySQL与Oracle的语法区别详细对比
MySQL与Oracle的语法区别详细对比 Oracle和mysql的一些简单命令对比在本文中将会涉及到很多的实例,感兴趣的你不妨学习一下,就当巩固自己的知识了 Oracle和mysql的一些简单 ...
- python语法区别
python语法区别: 大小写敏感 (动态语言:python)变量不用声明 p.s: 静态语言(Java)必须声明变量 语句末尾可以不打分号 可以直接进行数学计算 复制.粘贴功能失效,粘贴到别的地方的 ...
- 浅谈Swift和OC的区别
前言 转眼Swift3都出来快一年了,从OC到Swift也经历了很多,所以对两者的一些使用区别也总结了一点,暂且记录下,权当自己的一个笔记. 当然其中一些区别可能大家都有耳闻,所以这里也会结合自身的一 ...
- C、C++、Java、go的语法区别
详细C++.Java比较:http://www.cnblogs.com/stephen-liu74/archive/2011/07/27/2118660.html 一.C.C++的区别 在很大程度上, ...
- pyhton2 python3 语法区别
几乎所有的Python 2程序都需要一些修改才能正常地运行在Python 3的环境下.为了简化这个转换过程,Python 3自带了一个叫做2to3的实用脚本(Utility Script),这个脚本会 ...
随机推荐
- git merge简介
git merge的基本用法为把一个分支或或某个commit的修改合并到现在的分支上.我们可以运行git merge -h和git merge --help查看其命令,后者会直接转到一个网页(git的 ...
- MVC常用筛选器Filter
1.ActionFilterAttribute using System; using System.Collections.Generic; using System.Diagnostics; us ...
- java.lang.NumberFormatException: multiple points问题
一般这种问题主要是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以如果你在多线程环境中共享了SimpleDateFormat的实例,比如你在类似日期类中定义了一个全局的Simp ...
- jQuery如何退出each循环 和如何退出function函数
1.在函数内部使用return false是跳出function; 2.在each的回调函数中使用return false,是跳出each循环;return true 进入下一个循环: 3.break ...
- Python 中常见错误总结
IndentationError: unexpected indent Python 中强制缩进,, IndentationError: unexpected indent 缩进错误 这类错误非常常见 ...
- 李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?
日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...
- 【nodeJS爬虫】前端爬虫系列
写这篇 blog 其实一开始我是拒绝的,因为爬虫爬的就是cnblog博客园.搞不好编辑看到了就把我的账号给封了:). 言归正传,前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 ph ...
- Codeforces.914D.Bash and a Tough Math Puzzle(线段树)
题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...
- Codeforces.1045A.Last chance(最大流ISAP 线段树优化建图)
题目链接 \(Description\) 你需要用给定的\(n\)个武器摧毁\(m\)架飞船中的某一些.每架飞船需要被摧毁恰好一次. 武器共三种:1.可以在给定的集合中摧毁一架飞船:2.可以摧毁区间\ ...