Swift4.0语法杂记(精简版一)

序言

仁圣之本,在乎制度而已,

管理之本,在乎规则而已。

在软件开发过程中,通常一个软件项目要靠多人合作完成的。而在此过程中的修修改改一定会存在一些不可避免的问题。可能一不小心就闹出个大乱子呢。

一、Swift简史

1、介绍

Swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年开始着手设计,历时一年完成基本的架构。到后来苹果公司大力投入Swift语言的研发,于2014年发布这一语言的第一版本。Swift2.0之后的语法则趋于稳定,2017年发布的Swift4.0虽有改动,但也只是增添了一些新特性。这些新特性需要在Xcode9上运行才能显示出效果。值得一提的是它支持unicode9,也就是说,可以用某些图片图标来充当变量。

例如:

"??".count // 人 + 肤色
"?‍?‍?‍?".count // 有4个成员的家庭
"??\u{200D}??\u{200D}??\u{200D}??".count // 家庭 + 肤色
"??‍?".count // 人 + 肤色 + 职业
复制代码

2、特点

  • Swift取消了预编译指令,宏也被包括在内。 某些开发者为了让Objective-C和Swift代码兼容,会尽少在Objective-C中定义宏。

  • 取消了Objective-C中的指针等其他不安全访问的使用

  • 使用点语法来调用属性或者函数

  • 去除了NS前缀 3、为什么要学习swift

  • Swift作为面向协议语言,不仅能写移动端,也可以做到搭建服务器端。

  • 纵观国内外iOS开发界,已经有许多公司直接或间接采用Swift开发,使用swift语言开发已成为未来iOS开发的趋势。

  • Swift以简洁、优雅等优点迅速俘获广大开发者的青睐。

二、用playground体验swift开发

  • 打开Xcode,选择创建一个playground项目
  • 创建一个普通的UIView对象
    正如上图所示,playgound文件的左边是代码区,右边则是显示结果的区域。当点击用于眼睛时会实时显示出界面效果。 Swift与objective-C的重大区别
  • 在Swift中是没有.h和.m文件之分的。所有的代码全部都存储在一个文件里面。
  • 在Swift中所有的代码都被封装在{}里面
  • OC使用alloc init进行初始化,而Swift使用()
  • OC中使用[]来调用方法,而Swift中采用点语法。比如UIColor.red
  • Swift中不需要用分号分割语句

三、常量和变量

1、数据类型 在Swift中也有各种数据类型来存储不同的信息。下表列举的是常见的数据类型变量。

但其实,在Swift中,是不存在基本的数据类型的,所谓的数据类型,其实都只是结构体。这也是Swift中的一个特点。
2、变量和常量

  • 声明 Swift中用let声明常量,用var声明变量。
var x = 10;
let y = 20;

let z   //错误示范,let z 在声明的时候并没有赋值常量是不可改变的,只能在声明时赋值
复制代码

在开发中,通常会优先选择使用let,因为不可变会更安全一点。所以建议在写代码之时,先选择let,等到需要变化的时候再改成var。

  • 自动推导 创建一个UIView,不指定类型。可以看到控制台上会打印出UIView的信息。这个现象被称为swift的自动推导。事实上,在代码左侧定义的类型只是程序员希望的类型,而右侧才是程序真实的类型。
    也就是说,变量或常量的类型会根据右侧代码执行的结果,推导出对应的类型。可以使用热键option点击查看类型。
  • Swift对类型的严格要求 在Swift中,任何不同类型的数据之间是不允许直接运算的。比如下面这段代码就会报错。
//错误示范
let a = 10
let b = 12.5
print(x + y)
复制代码

如果非要让不同类型数据之间能够运算,可以将其中一个类型进行转换。

let a = 10
let b = 12.5
print(a + Int(b))
复制代码

此时得到的结果就是22。在Swift中,做类型转换时是将数据括起来,相当于swift结构体中的构造函数。

当然也可以将前面的整数转换成Double型。此时就能打印出小数来。

print(Double(a)+b)
复制代码

#####四、String类型和Bool类型 1、String类型

  • 声明 直接用双引号将数据引起来
let str = "小仙女"
let str1:String = "hahh"
复制代码
  • 拼接 字符串的连接有两种方法,一种是通过加号来连接,另一种则是通过反斜杆进行插入。
let str = "小仙女"
let mesg1 = "one"+str //用加号的方式
let mesg2 = "two,\(str)" //反斜杠的方式
print(mesg1,mesg2)
复制代码

在做字符串拼接时要注意加号和反斜杠后面都不能出现空格,不然会报错。

  • 拼接字符串时格式的变化 假设在某些特定的地方需要输出特定位数的字符,比如或时间的输出,就需要使用占位符来调整字符串的格式。使用String的构造函数,调用format方法,%0后面加上数字就表示需要占多少位数。
let min = 2
let second = 10

String(format: "%02d:%02d", min,second)
复制代码
  • 遍历 调用字符串的characters属性,采用for...in...的方式来遍历字符串。
for c in str{
    print(c)      //swift4中的遍历
}
print(str.count)  //打印字符串长度

for char in myString.characters {
    print(char)   // swift3的遍历
 } 
print(str..characters.count)  //Swift3打印字符串长度
复制代码
  • 字符串的截取 最方便的方式就是将String类型转换成OC的NSString类型,再来截取。
let urlStr = "www.baidu.com"
let header = (urlStr as NSString).substring(to: 3)  //截取前三位

let middle = (urlStr as NSString).substring(with: NSMakeRange(4, 5))//去除前四个字符截取,范围之后五位字符

let footer = (urlStr as NSString).substring(from: 10)   //从第十个字符开始截取
复制代码

2、Bool类型

与其他语言一样,Bool类型表示的就是真假,但是不同于Objective-C,Swift中用true和fa

五、可选类型

在Objective-C开发中,如果一个变量暂时不会使用到,可以将它赋值为0或者赋值为空,而在Swift中,nil是一个特殊的类型,如果它和真实类型不匹配是不能进行赋值的。但是开发中将变量赋值为空是在所难免的事情,因此就推出了可选类型。 可选类型是Swift的一大特色,在定义变量时,如果指定这个变量是可选的话,就是说这个变量可以有一个指定类型的值或者为nil。

1、定义一个optional的变量

let x:Optional = 10
print(x)
复制代码

点击进去查看,可以发现Option其实是一个枚举类型。这个枚举有两个值,一个是none,表示没有值,而另一个是some,表示某一类值。 在输出的时候,可以看见控制台上的内容Optional(10),它的作用就是提示这是一个可选值。 而在实际开发中,一般不用上述方式创建可选值,而是指定一个类型,再在其后添一个问号。

let x:Optional = 10  //第一种写法

let x:Int? = 20     //第二种写法
print(x)
复制代码

上述代码问号的意思就是定义一个可选的Int类型,可能没有值,也可能有一个整数。

2、 解包 试试将上面案例x和y相加,这个时候还能输出结果么?

此时可以看到编译器已经报错。在前面的教程中提到过,不同类型的值是不能直接运算的。而可选项有两种值的产生,若它的值为nil则不能参加计算。 因此引入解包的概念,“!”代表强制解包。它的意思是从可选值中强行获取对应的非空值。

print(x!+y!)
复制代码

3、解包常见错误

//错误示范1
let y : Int?
print(y)
复制代码

使用let定义的是常量,在初始化时必须要给出值。

//错误示范2:
let y : Int? = nil
print(y)
复制代码

强制解包是危险操作,如果可选值为nil,强制解包系统会奔溃。

4、let和var的可选项默认值

//默认值测试
let x: Int?
print(x)
var y :Int?
print(y)
复制代码

用let做测试时会直接报错,说明let的可选值是没有默认值的,而用var做测试时,报错信息就变成了警告,运行的结果为nil。可以由此推测出var的可选项默认值为nil。 Swift中有规定,对象中的任何属性在创建对象时,都必须有明确的初始化值。

5、可选绑定 用if let/var表示。它将变量赋值给一个临时变量,在这个操作中会做两步操作:首先判断变量是否有值,如果没有值,则直接不执行大括号里面的内容;如果有值,系统会自动将变量进行解包,并且将解包后的结果,赋值给临时变量。 比如下面这个例子: 通过一个字符串创建NSURL对象

let url: URL? = URL(string: "https://www.baidu.com")
复制代码

接着创建NSURLRequest对象。强制解包非常危险,当url有中文的时候可能会变成nil。所以要判断url是否为空再对其进行解包。

if let url = url {
    let request = URLRequest(url: url)
}
复制代码

六、Swift中的分支

1、if语句 在Swift中,if语句是不用带小括号的,但是后面跟的语句必须有花括号,哪怕只有一行代码。许多公司的代码规范也是规定必须使用这一格式。 注意:在Swift中没有非0即真的说法,所以不能写成if(num)这样的格式。

let x = 9
if x > 5 {
    print("小仙女")
}else{
    print("妖精哪里跑")
}
复制代码

2、三目运算符 三目运算符的写法是表达式后跟一个问号,用冒号来隔开条件是否成立的值。

let x = 10
x > 5 ? print("小仙女"):print("妖精")
复制代码

非常有意思的是,如果开发者只想处理条件成立的部分,此时可以在冒号后面用一个小括号来代替条件不成立的部分。

x > 5 ? print("你都写了我两次啦"):()
复制代码

3、 三目运算符的简单模式 三目运算符的简单模式通常是用于处理可选项的。“??”的意思是说,如果表达式有值,就使用那个值,如果没有,就使用“??”后面的值来代替。

let x:Int? = nil
let y:Int? = 9
print((x ?? 0) + (y ?? 0))
复制代码

运行之后的结果为9。 之后再来说说运算符的优先级。举个简单的栗子?!

let name:String? = "安琪拉"
print((name ?? "") + "火烧屁屁咯")
print(name ?? "" + "火烧屁屁咯")
复制代码

从运行的结果可以看到,“??”的优先级是最低的。如果没有小括号的约束,它会将后面的语句都当成是一个表达式。

4、 guard的用法 分支若是写得过多,就会导致代码可读性较差的问题。为了降低代码的层次,swift推出了guard。guard后面跟判断表达式,else后面写表达式不成立的代码。 需要注意的是guard必须写在函数内部,在最末尾出必须要跟关键字return/continue/break/throw中的一种。

import UIKit
let age = 20
func online(age : Int){
    guard age >= 18 else {
        print("还未成年呢")
        return
    }
    print("一起来开黑吖")
}
复制代码

这样或许看不到guard的特别之处,但若是像下面这样的代码出现呢?

let age = 20
let money = true
let idcard  = true
func online2(age : Int,money:Bool,idcard:Bool){
    if age >= 18 {
        if money {
            if idcard {
                print("一起来开黑吖")
            }else{
                print("回去带身份证吧")
            }
        }else{
             print("回去拿钱")
        }
    }else {
        print("还未成年呢")
    }
}
//调用
online2(age: age, money: money, idcard: idcard)
复制代码

如果用普通的分支方法,就会显得可读性太差。我们可以试着将它改成guard的写法。

func online1(age : Int){
    //判断年龄
    guard age >= 18 else {
        print("还未成年呢")
        return
    }
    //判断是否有钱
    guard money else {
        print("回去拿钱")
        return
    }
    //判断是否带了身份证
    guard idcard else {
         print("回去带身份证吧")
        return
    }
    print("一起来开黑吖")
}
复制代码

执行完所有的判断语句之后才执行代码库,阅读性也比if……else分支强。

5、 switch

  • 最基本的用法 switch后面的小括号可以省略。用case关键字来表示不同的情形,case语句结束后,break也可以省略。
let sex = 0
switch sex {
case 0:
    print("男")
case 1:
    print("女")
default:
    print("其他")
}
复制代码
  • 基础语法的补充
如果系统某一个case中产生case穿透,可以在case结束后跟上fallthrough
复制代码
case  0:
    print("男")
    fallthrough
复制代码
case后面可以判断多个条件,这些条件以逗号分开
复制代码
let sex = 0
switch sex {
case  0,1:
    print("正常人")

default:
    print("其他")
}
复制代码
switch可以判断浮点型、字符串类型和Bool类型
复制代码
switch 3.14 {
case  0:
    print("正常人")

default:
    print("其他")
}
复制代码
let opration = "+"
switch opration {
case  "+":
    print("加法")
case "-":
    print("减法")
default:
    print("其他")
}
复制代码

七、swift的for循环和表示区间

1、变化 在Swift3开始,就已经弃用了var i = 0; i < 10; i++的这种写法。并且++这种写法也被取消掉了,改为+=代替。

2、表示区间 Swift常见区间有两种,开区间用..<表示,闭区间用...表示。要注意的是数字和省略号之间是不能加空格的。

func demo1() {
    for i in 0..<5 {
        print(i)
    }
    print("^^^^^^^")
    
    for i in 0...5 {
        print(i)
    }
}
demo1()
复制代码

3、逆序操作 如果想要做逆序操作,只要在in后面的表达式后添加reversed()即可。

func demo1() {
    for i in (0..<5).reversed() {
        print(i)
    }
    
}
demo1()
复制代码

最后

今天先分享到这里,喜欢或者有收获的朋友可以关注主编和点赞哦,之后小编还会接着分享Swift4.0大家持续关注啦小编也有个iOS技术交流群:656315826(闲聊勿扰)欢迎大家入住

转载于:https://juejin.im/post/5ab5115ef265da23a049812b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值