(一)简介

(1)优于OC,快速,安全

(2)取消了预编译指令包括宏定义(OC用的太多了)

(3)取消了OC指针和不安全访问的使用(看不到星星了)

(4)全部点语法

(5)3.0中对Foundation框架做了很多改变,去除了NS,将绝大部分class转换成struct结构体(为了考虑性能和安全性,绝大部分使用结构体来代替以前的类,但是在实际使用感觉不到)

(6)以前是OC调UIKit,现在就是Swift调UIKit,这点事没问题的

(7)swift因为语法的严谨性可以让很多错误提前遇到,这样很少出现bug让程序停在main导致无法找到

(8)@UIApplicationMain是程序的入口

(9)只有.h没有.m

(10)所有的代码都包括在{}里,默认方法func都有缩进!

(11)语法的allocinit替换成()

(二)PlayGround

(1)可以看苹果官方自带的tips和100个tips,都在Placground来使用

(三)基础

(1)不适用self. 在闭包或者编译器提示的时候再使用

(2)分号是用来分割语句的,如果一行洗很多,就可以加分号,一般时候可以不加

(3)#function打印执行的函数

(4)添加标记用到// MARK: - 选择,如果是接下来要做的可以用// TODO:和// FIXME:这些非常有用

(四)变量和常量

(1)let:常量,如果从没被修改过,那就用let,不可变的更安全,所以尽量使用let,需要变化时候改var

(2)var:变量

(3)可以自动推导类型(Option + Click)整数默认Int,小数默认Double

(4)Swift对类型要求异常严格,任何不同类型的数据不能直接运算(哪怕是Int和Double),不会做一些自动的转换来转换成Double。Swift不存在基本数据类型,Int和Double都是结构体其实,强转用Double(x)完成,或者在定义的时候直接指定变量的类型let x : Double = 10;(很少使用)

(五)可选项(Optional)

(1)定义变量时,如果是可选的,表示可以有值,也可以是nil,用“?”

(2)强行解包 “!”,程序员来注意!,并且要少用,可能会崩

(3)最常见的错误:解包的时候发现nil。fatal error: unexpectedly found nil while unwrapping an Optional value

(4)let可选的话,没有默认值,需要赋值。var可选的话,默认值为nil

(5)可选项在参与计算时候必须解包

(六)逻辑分支(if)

(1)三目运算符:Int(x!) > 5 ? print("dayu5") : print("xiaoyu5") 或者 Int(x!) > 5 ? print("dayu5") : () 这样就对后面的不作处理。()表示空执行。

(七)不强行解包的方法

(1)强行解包的写法:"??"一个简单的三目,这样无需做很多判断,是不是xy都不得0了。注意?? 必须加个(),因为??操作符号的优先级低,是最后判断的,所以不加()可能后面的都当做判断不执行了。??写法不需要解包了

func demo(x: Int? , y : Int?) {

print( (x ?? 0) + (y ?? 0) )

}

(2)if let的写法:iflet/ifvar连用就可以进行判断,这个let的x1和y1作用于只在循环里,iflet/var也不需要解包了

if let x1 = x , let y1 = y {

print(x1 + y1)

}

(3)guard let else的写法:和iflet相反,else里面一般是没值return,之后才执行需要的代码。guard可以降低分支层次,如果要执行的代码很多,本来在if里执行,{}就多了一层,如果用guard守卫一定有值才执行,这样层次就少了一层。guardLet很重要,也可以省略很多解包

guard let x1 = x , let y1 = y else {

print("x&y没值")

return

}

print(x1 + y1)

(4)guardlet和iflet可以用同名变量接收。因为总会取名字,if let name = name这样就可以,注意后面使用的时候用非空的那个!并且iflet和guardlet可以依次判断,先判断是一个字典,再拿字典的数组,在判断数组的值,可以一条线判断出来。

(八)循环

(1)switch:

*(C中分支必须是整数,每一个语句都需要break,如果要定义局部变量需要{}

* Swift可以任意判断,一般不需要break,多值判断用逗号,所有分支都至少需要一条指令,如果什么都不干,才要写break

func demo(name : String) {

switch name {

case "guoguo","aixin":

print("guoguo")

default:

print("shit")

}

}

(2)for:swift取消了i++和++i和传统的for循环

for i in 0...5 {

}

for i in 0..<5 {

}

(3)反序遍历:

for i in (0..<10).reversed() {

}

(九)字符串:用String,是一个结构体,具有绝大多数NSString功能,支持直接遍历

(1)遍历:

func demo3() {

// 字符串遍历(NSString不支持这么遍历)

let str = "wowosnshi是"

for s in str.characters {

print(s)

}

}

(2)长度:

// 返回指定编码对应的字节数,每个汉字三个字节

print(str.lengthOfBytes(using: .utf8))

// 返回真正字符串长度

print(str.characters.count)

(3)拼接:要注意可选项拼接不解决会带上Optional,剩下的都可以拼接,再也不用看StringWithFormat了

let name = "AA"

let age = 19

let title : String? = "sss"

print("\(name)\(age)\(title ?? "")")

(4)格式化:

*格式化成日期

let h = 8 , m = 10, s = 44

// OC中用stringWithFormat格式化日期,Swift中可以

let strDate = String(format: "%02d-%02d-%02d", h,m,s)

print(strDate)

(5)截取字符串:建议用NSStrin作中转,因为swift取串方法一直在改变

*NSString方法

let str = "红红火火恍恍惚惚"

let strOC = str as NSString

strOC .substring(to: 1)

strOC.substring(with: NSMakeRange(0, 2))

*3.0方法

(十)数组:

(1)就是中括号,注意数组的类型,并且基本数据类型不需要包装,可以直接方数组里,如果类型不一样(混合数组,但是基本不用),自动推导[NSObject]。在Swift中还有一个[AnyObject类型],标示任意对象,因为在Swift中一个类可以没有任何父类。

(2)遍历:

let array = ["张三","李四","王五"]

// 遍历1(按照下标遍历)

for i in 0..<array.count {

}

// 遍历2(遍历元素)

for s in array {

}

// 遍历3(同时遍历下标和元素)

for e in array.enumerated() {

// let e: (offset: Int, element: String) e是一个元组

print("\(e.offset), \(e.element)")

}

// 遍历4(同时遍历下标和元素)

for (n,s) in array.enumerated() {

print("\(n),\(s)")

}

// 反序遍历

for s in array.reversed() {

}

// 反序索引下标(这样写才对,先枚举再反序)

for (n,s) in array.enumerated().reversed() {

}

(3)增删改:

array.append("AA")

array[1] = "BBB"

array.remove(at: 2)

(4)合并:用“+”号。但是要合并的数组的两个类型必须一致。

(十一)字典:一般是[String:NSObject],对应键值对.由于3.0后大部分都是结构体了,AnyObject不好用了,Any范围更大

(1)字典数组:

(2)增删改:和数组都类似,就是两个字典合并不像数组直接相加,而是需要遍历

(十二)SWift的类,结构体,枚举三种都有构造函数,都可以有方法,就像OC的类。枚举再swift变化很大,一般开发不会用到太高级语法。

(十三)函数:

(1)外部参数,当外部参数用_替代的时候,会在外部调用的时候忽略形参名

(2)函数的默认值(OC不具备),这个使Swift比OC灵活很多很多,一个方法可以做很多事,因为OC会有各种参数和组合,Swift只需写一个最多的参数,然后不需要的设定默认值就是了

3)无返回值 :直接省略 () Void都可以

(4)闭包:类似Block,比Block还广泛。OC中Block是匿名函数,Swift中函数是特殊的闭包。闭包在整个开发中和Block的应用场景一样。用于控制器/自定义视图/异步执行完成的回调。这些回调的特点就是都是以参数回调处理结果,返回值为Void。

*定义:

let biBao = { (x: Int) -> Int in

return x + 100

}

print(biBao(10))

*GCD:将任务添加到队列,指定执行任务的函数。任务就是Block/闭包,队列以同步/异步的方式执行。

func loadData(compeletion:@escaping ( _ result: [String])->()) -> Void {

DispatchQueue.global().async {

print("耗时操作会获得一些结果 \(Thread.current)")

Thread.sleep(forTimeInterval: 1.0)

let json = ["天气","不错","刮大风"]

// 主线程回调

DispatchQueue.main.async(execute: {

print("主线程更新UI \(Thread.current)")

// 回调 -> 通过参数传递 执行闭包

compeletion(json)

})

}

}

调用:

// 执行的适合我就拿到了值

loadData { (result) in

print("获取的新闻数据 \(result)")

}

*尾随闭包:如果函数的最后一个参数是闭包,那么参数就省略了,最后一个参数直接{}大括号包装

*闭包的循环引用:

方法1

        

      方法2

      

(5)面向对象(各种构造函数):()就是allocInit,在Swift中对应init()。在swift中一个项目所有类都是共享的,可以直接访问,每一个类都默认有一个命名空间。A.name B.name God.name Dog.name。同一个类可以从属于不同的命名空间(假如有一个框架有Person类,做用户,还有一个框架做后台,也用Person。在OC中就只能靠前缀解决,HouTaiPerson,KuangJiaPerson。而Swift中的命名空间就是项目名。AAA项目有一个Person,那么AAA.Person就是AAA的Person类,此时再导入框架,那也是框架的.Person)

*在自定义的Nsobjiect类中,has no initalizers 标示没有初始化器,初始化器可以有多个,默认是init。当这个类有属性的时候,属性要分配内存空间,就是说要有初始值。那么其实就是先给自己的属性分配,然后给父初始。其实这么一看,Swift和OC是相反的!

思路:OC是先调用爸爸。就是Person,Person会再调用NSObject,就是先跑上去什么都不管,先初始化了NSObject,然后才往下走挨个初始化。Swift是把自己完全初始化,再上去初始化爸爸,这么看比OC快了一圈,性能要好。

*重载构造函数:(重写是父类有这个方法,override。重载是函数名相同,参数和个数不同。init就重写,init+参数就重载。OC是没有重载的!都是initWithXXXXX)。重载其实是最基本的方式,OC没有其实很low,但是Swift有。

注意:如果重载了构造函数并且没有实现父类的init,那么系统不再提供init构造函数了(默认是有的),因为默认的构造函数不能给本类的属性分配空间(你不自己写name = ,系统就没办法分配)

nsobject类的isa属性就是为了记录当前状态的对象是什么的,就是一个student对象,云云。在swift中打p可以打印类内容

*KVC构造函数:只需记住下面4点

****所以一般在模型中加个? 然后用KVC实现(先调用init因为是运行时机制)

*模型中属性定义:基本数据类型 = 0,对象设置?

运行时中,基本类型设置?    属性设置私有都会让运行时拿不到,此时kvc就会出错。

*如果子类没有重写父类方法,调用的时候就会直接调用父类的方法。当继承一个类,就继承所有属性和方法,包括KVC。当PERSON写好了KVC后,

*整体

(6)便利构造函数:关键字Convenience(开发用的很少,因为模型都是框架转,UI不需要便利)

*目的:条件判断,只有满足条件才实例化对象,防止不必要的内存开销,简化对象创建。本身是不负责属性的创建和初始化的。

说白了就是有些函数 带个? 返回值可以返回空,这就是便利构造函数的功劳。

* 主要用于条件检查和控件创建。

在控件创建的时候,就不用?了,因为我就是为了创建控件的。

  

(7)deinit:类似OC的Dealloc

(十四)分类:extension

便利构造函数 + 分类可以省略抽取很多代码。例如给UITextField/UIButton写分类,然后写便利构造函数,方便。

(十五): 运行时可以获取到一个对象的所有属性方法等等,获取到了属性可以KVC进行字典转模型,这是所有第三方转模型插件的基础,获取到了方法,可以动态的发送各种方法。在swift中,如果一个基本变量Int什么的用?修饰了,可选了。此时运行时是找不到的,所以KVC会崩溃,同时,如果修饰了private属性,运行时也是找不到,KVC也会崩溃。其实在OC中,private是基本不用的,而且存不住任何私有,都可以被运行时找出来。但是swift就是真的藏起来了,找不到这个属性和方法了外界。

转载于:https://www.cnblogs.com/sgxx/p/6093807.html

Swift3.0语法1相关推荐

  1. 小码哥-斗鱼直播APP之Swift3.0适配

    Swift3.0适配 Swift3.0介绍 目前苹果已经发布了正式版的Xcode8.0&Swift3.0 在之后的开发中,我们会直接使用最新版本的Xcode&Swift版本 Swift ...

  2. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...

  3. Swift3.0语言教程字符串与文件的数据转换

    Swift3.0语言教程字符串与文件的数据转换 Swift3.0语言教程字符串与文件的数据转换,如果想要对字符串中的字符进行永久保存,可以将字符串中的字符写入到文件中.当然,开发者也可以将写入的内容进 ...

  4. Swift3.0语言教程字符串转换为数字值

    Swift3.0语言教程字符串转换为数字值 Swift3.0语言教程字符串转换为数字值,在NSString中,开发者可以将字符串转换为数字值,通过这些数字值可以实现一些功能,如加法运算.减法运算等.数 ...

  5. Swift3.0语言教程使用URL字符串

    Swift3.0语言教程使用URL字符串 Swift3.0语言教程使用URL字符串,和路径一样,URL其实也是字符串,我们可以将这些字符串称为URL字符串.本小节将讲解URL字符串的使用. 1.编码 ...

  6. Swift3.0语言教程使用路径字符串

    Swift3.0语言教程使用路径字符串 Swift3.0语言教程使用路径字符串,路径其实是字符串的一种,我们称为路径字符串.本小节将讲解如何使用路径字符串. 1.组合路径 开发者可以将数组快速的组合成 ...

  7. Swift3.0语言教程删除字符与处理字符编码

    Swift3.0语言教程删除字符与处理字符编码 Swift3.0语言教程删除字符 Swift3.0语言教程删除字符与处理字符编码,在字符串中,如果开发者有不需要使用的字符,就可以将这些字符删除.在NS ...

  8. Swift3.0语言教程分割字符串与截取字符串

    Swift3.0语言教程分割字符串与截取字符串 Swift3.0语言教程分割字符串 如果想要快速的创建一个数组,我们可以将字符串进行分割,分割后的内容将会生成一个数组.在NSString中有两个分割字 ...

  9. Swift3.0语言教程组合字符串

    Swift3.0语言教程组合字符串 Swift3.0语言教程组合字符串,当开发者想要将已经存在的字符串进行组合,形成一个新的字符串,可以使用NSString中的两个方法,分别为appending(_: ...

最新文章

  1. Server.Transfer 和 Response.Redirect 的用法
  2. win10打字突然变成繁体
  3. t3软件怎么生成报表_临沂用友畅捷通T3财务通软件财税一体化
  4. WP7 网络请求之WebClient
  5. “宇宙最强”GPU —— NVIDIA Tesla V100 面向开发者开放试用!
  6. Java 原生 JDBC 代码操作演示
  7. Flask 下载中文名文件
  8. 单循环比赛规则-java
  9. 各地级市系列环境指标数据(2003-2017年)
  10. 为什么JAVA对象需要实现序列化?
  11. 地下城与勇士正在自动连接频道服务器,DNF爆满频道服务器连接失败解决方法分享...
  12. 创新工场投资经理:创业就是九死一生
  13. ARM、8051、AVR、MSP430、Coldfire、DSP、FPGA七种体系比较区别
  14. RK3326 android10.0(Q) 系统精简瘦身
  15. 【CNC——第9.1篇】使用Setup引导程序整定步进电机(开环步进电机整定方式之1)
  16. 软件开发技术职位分析及职业规划
  17. 视频关键帧inceptionV3Xception特征提取
  18. 链家全国房价数据分析 : 数据获取
  19. Java—反射机制实战及动态代理总结
  20. python练习20:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

热门文章

  1. Python 语言程序设计(5-2)七段数码管程序编写设计
  2. etl spring_山寨一个Spring的@Component注解
  3. thinkpad键盘功能键驱动_韩度X-104机械键盘拆解评测 - 性价之选
  4. 荷兰 转专业申请计算机,荷兰留学转专业申请须知
  5. 充电速度公式_手机充电效率计算
  6. 【知识索引】【C++入门】
  7. yaml与json的对比
  8. 聊聊Elasticsearch的BootstrapCheck
  9. Stetho简化Android调试(二)
  10. 使用Slim框架创建一个JSON RESTfull API