文章中的内容已全部更新至Swift5!
Swift是一门新的语言,不过现在已经出到Swift5了,今天不介绍这些。很多人想学Swift,不知从何开始,今天我就简单说下入门知识,我认为在学习Swift之间最好先把这些基本的知识掌握了,才能更好的去认识它学习它,使用它。
全是干货,并且附上demo:swift基础知识demo。
阅读顺序:
Swift开发入门-基础知识(一)
Swift开发入门-进阶知识(一)
Swift开发入门-进阶知识(二)
下面👇的基本介绍,我建议大家认真读一读,尤其是从OC转过来的程序员一定要看一下,Swift是一门全新的语言,和OC的差别很大。
注:代码里面的注释很清楚,很详细,所以语言描述大多会省略
开始 --- Swift --- Coding
基本介绍
这里只介绍一些初学swift的基本概念,需要提前了解的东西
- Swift语法和OC不一样,OC每一行代码都是以分号 ";" 结尾的,但是Swift结尾是没有结尾标识符的
- 之前Swift非常注重格式,比如
a = 3
,在=
的左右必须都有一个空格。现在前后空格个数不一样,不会报错了,但是还是建议写的规范一些。 - OC调用方式的时候是,是类名或对象名+空格+方法名,然后用中括号括起来:
[Person saveCall]
; Swift是类名或对象名+.
,+方法名即可:person.saveCall
,类似与OC的点语法 - Swift语法整体兼容OC,可以通过桥接和OC无缝对接
- Swift语法风格整体类似于Java
- 新建的Swift类,只有一个.swift文件,没有.h文件和.m文件
- Swift可以使用cocoapods,方法同OC一样
- 不需要导入头文件,可以直接引用其他类里面的方法或属性
- Swift没有宏这个概念
10.Swift没有类扩展一般写在最下面 - 没有
main.m
文件,@UIApplicationMain
是程序入口标识 - class 标示声明类
{}
用来标识类的范围 - 构造函数
[xxx alloc] initWithXXX]
==>xxx(XXX:)
;[alloc init]
=>()
-
UIButtonTypeContactAdd
=>枚举类型.枚举值(简写 .枚举值)
- 在当前类中访问属性或者方法的时候 可以省略
self.
,推荐不写,后面的闭包中必须添加self.
- 按钮的监听事件:使用
#selector
- 整体语言风格类似java
- Swift语言要求严格,属于静态语言。编译之前,就会对语法类型等,进行检测
1. 常见和变量
// MARK: - 常量和变量
func testDemo1() {
let a = 10
// a = 2 ----> 会报错 let定义的变量不能改变,不能进行赋值
print(a) // ---> 打印使用print语法,不适用nslog
var b = 20
b = 30 //不会报错,var定义的变量是可以被修改的
print(b)
let c: Int = 10
let d: CGFloat = 20.3
/*
swift是一个强类型的语言
option + click 是swift开发的热键 没有之一
Int 是swift中整数的默认类型(NSIbteger)
小数默认类型是double
let d: CGFloat = 20.3 这属于手动指定类型
*/
// let res1 = c + d --> 会报错
let res2 = c + Int(d)
print(res2)
/*
不同类型之间的运算
swift中类型不一样的时候不能操作,没有银行形式的转换 需要coder手动转换数据
转换类型: 通过类型调用构造函数 传递参数转换 ,或as语法
*/
// let f: Int
// print(f) //报错,未初始化之前都不能使用
}
2. Swift与OC的不同演示
func scondDemo() {
let myView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
// myView.backgroundColor = UIColor.yellow
myView.backgroundColor = #colorLiteral(red: 1, green: 0.3233583075, blue: 0.3979080506, alpha: 1)
//color Literal属性
let btn = UIButton(type: UIButtonType.custom)
//let btn1 = UIButton(type: .contactAdd) 可以简写 直接.+枚举
myView.addSubview(btn)
//添加到根视图 --> 这里可以省略self,也可以写self.view
view.addSubview(myView)
//给按钮添加点击事件
btn.addTarget(self, action: #selector(btnDidClick), for: .touchUpInside)
}
@objc func btnDidClick() {
print("我被点击了")
}
3. 元组
// MARK: - 元组
func testDemo3() {
//元组可以吧多个值组合成一个复合值.元组内的数据可以是任意类型的,重点:不要求元素的类型相同
//不想接收值,直接用下划线_代替
//可以使用标签,类似于字典
let xiaoming = (25,"小明","清华大学")
print(xiaoming.0,xiaoming.1)
let (age, name, _) = xiaoming
print(age,name)
let xiaozhou = (age: 29, name: "神合")
print(xiaozhou.age,xiaozhou.name)
}
4. 可选类型
可选类型将是我们在学习swift中的一个大雷,短时间内我们很难接受,这是一个全新的概念,是OC中没有的
- 可选类型有可能有值,也有可能为nil
- let声明可选类型是没有意义的
- 必选类型一定有值
var a:Int? = 10
a = nil
//这就是一个可选类型
//不能够对可选类型做强制解包
var b: Int? = 15
let c = (b ?? 0) + 20
var d = 10
let res = 20 + d
print(res,(b ?? 0),c,d)
//可选类型不能够直接计算
你是否需要使用'?'或者'!'进行解包
-- '!' 强制解包 一定要获取一个值 不能够为nil
-- '?' 可选解包 后面具体说
-- 如果可选类型要进行计算的时候,系统会报错,需要程序员手动处理可选类型
-- '!' 强制解包有风险,需要谨慎使用,程序员需要对'!'负责 如果为nil 程序会崩溃
-- 一定要考虑是否安全 一定有值 防患于未然
-- '??' 合并空选项 必须提高 ?? 的优先级
5. 分支结构
分支结构也就是if语句和switch语句
分支结构 if语句
- 条件语句没有
()
,可以写,但不推荐写 - 分支结构必须有
{}
- 没有非零即真的概念,只有
true
和false
let a = 13
if a < 14 {
print("小,很小,非常小")
} else {
print("大,很大,非常大")
}
5.1 if let
模拟网络请求
let urlString = "http://www.zxhkit.com"
let url = URL(string: urlString)
if url != nil {
let req1 = URLRequest(url: url!)
}
if let url2 = URL(string: urlString) {
let req2 = URLRequest(url: url2)
//只有当url2不为空的时候,才会执行里面的代码
}
5.2 guard(守卫) let else
作用与if let 相反 , guard let 能够减少一层分支嵌套
let urlStr = "http://www.zxhkit.com"
guard var url1 = URL(string: urlStr) else {
//不希望guard 能够被穿透
//如果url1 为nil 就进入else 分支 会直接return
return
}
let req = URLRequest(url: url1)
5.3 guard 多个可选值的判断
var age1: Int? = 15
var age2: Int? = 20
if age1 != nil && age2 == nil {
print(age1!,age2!)
}
guard let _ = age1,let _ = age2 else {
print("嘎嘎嘎")
return;
}
5.4 switch
switch在swift中和OC中略有不同
- 不需要写break
- 每个匹配项中至少有一段代码可以执行
- 可以判断任意类型
- 一次可以匹配多个值
- 在匹配项中可以声明临时变量,而且不需要加 {} 限制作用域
let x = "20000"
switch x {
case "20000","30000":
print("架构师")
case "18000":
print("高级开发工程师")
case "12000":
print("中级开发工程师")
case "6000":
print("菜逼")
default:
print("逗比")
}
6. 循环
循环,基本没有变
6.1 首先是where
语句和repeat-where
语句(类似OC的do-where
)
// while语句
var num = 5
while num > 0 {
print(num)
num -= 1
}
//打印结果:
/*
5
4
3
2
1
*/
//repeat-while相当于OC中的do-while
var ber = -4
repeat {
ber += 1
print(ber)
} while(ber > 0);
6.2 for循环
func testDemo6() {
// 循环的范围可以直接定义出来使用
let range = 0...10
for i in range {
print(i)
}
print("----------------------")
//遍历0到10,不加包括10, 0..<10 表示不包括10
for i in 0..<10 {
print(i)
}
//对没有使用的变量或者常量在编译的时候可以忽略
for _ in 0..<10 {
print("😑")
}
print("----------------------")
let names = ["anni","roky","lily","bob","jeem"]
for name in names {
print(name)
//这里可以打印出来每一个元素值
}
for name in names[0...2] {
//只会打印前三个
print(name)
}
for name in names[..<2] {
//半开区间,只会打印前三个
print(name)
}
}
6.3 continue和break的使用
//break将直接跳出当前循环
//continue继续当前循环,但是continue后面的代码不再执行
for i in 1...10 {
if i == 2 {
continue
}
if i > 7 {
break
}
print(i)
}
7. range
// MARK: - range
func testDemo7() {
// 补偿一点:range
let range = 0...9
let isHave = range.contains(4)
print(isHave)//结果是怎么样的呢
let range1: ClosedRange<Int> = 1...5
let range2: Range<Int> = 1..<6
let range3: PartialRangeThrough<Int> = ...5
print(range1,range2,range3)
let strRange1 = "a"..."f"
let isRh = strRange1.contains("b")//结果:true
let strRange2 = "cc"..."ff"
let isRh1 = strRange2.contains("cb")//结果:false
let isRh2 = strRange2.contains("dz")//结果:true
let isRh3 = strRange2.contains("fg")//结果:false
print(isRh,isRh1,isRh2,isRh3)
//从打印结果看,表示两个字母都必须在这个范围内
let time = 13
let margin = 2
for item in stride(from: 4, through: time, by: margin) {
print(item)
//表示从4开始,一次累加2,直到13(不超过13)
}
}
8. 字符串
这个我们在开发中会经常用,而且字符串有很多方法属性,我们只介绍常用的
//字符串的本质是结构体
let str: String = "长得帅可以撩妹,长丑是骚扰"
//String和NSString可以相互转换
let NSstr = str as NSString
print(NSstr)
//字符串的基本属性
let str1 = "长得帅可以撩妹,长丑是骚扰"
//长度
let len = str1.lengthOfBytes(using: .utf8)
print(len)
//字符集合
let length = str1.count
print(length)
遍历字符串
for character in str1 {
print(character)
}
字符串的拼接
//使用 + 来拼接字符串
let str2 = "别低头,绿帽会掉"
let str3 = "别哭泣,老王会笑"
let res1 = str2 + str3
print(res1)
let name = "王哥"
let age = 13
字符串的转义:
// : \() 转义符号 转义字符串
let res2 = name + String(age)
let res3 = name + "\(age)"
let res4 = "\(name)\(age)"
print(res2,res3,res4)
字符串的格式化:
let z = 9
let x = 1
let h = 20
// 09:01:20
//可以接受可变参数
let res5 = String(format: "%02d:%02d:%02d", z,x,h)
print(res5)
字符串的截取:
//字符串的截取
let str4 = "我喜欢手指在键盘上飞舞的感觉"
let start = str4.index(str4.startIndex, offsetBy: 3)
let sub1 = str4.suffix(3)
let sub2 = str4.suffix(from: start)
print(sub1,sub2)
9. 集合: 数组,字典
9.1 数组的声明 和 空数组的实例化
- 不推荐在数组中放不同的元素
- 实例化空数组
- 常量类型的空数组没有意义
let array: [Any] = ["阿大,阿二,阿三",18]
print(array)
var emptyArray = [String]()
9.2 数组的增删改查,遍历数组,同时遍历角标和对应的值:
//2.增删改查
//var表示可变数组
var arr = ["大哥","二哥","三哥","四哥"]
//增
arr.append("老司机")
//改
arr[0] = "姐姐"
//删
arr.remove(at: 1)
//查
for str in arr {
print(str)
}
//倒序遍历
for str in arr.reversed() {
print(str)
}
//同时遍历角标和对应的值
for (index,value) in arr.enumerated().reversed() {
print(index)
print(value)
}
9.3 数组的合并 :
//数组的合并
let array1: [Any] = ["老张","老李",19]
let array2: [Any] = ["大哥","大姐",23]
let array3 = array1 + array2
print(array3)
9.4 字典: 声明、增删改查
- 同样是使用[] 来声明;
- [String : Any] 是最常见的字典格式
let dict: [String : Any] = ["name" : "玄哥","age" : "21"]
//声明空字典
var emptyDict = [String : Any]()
var dic: [String : Any] = ["name" : "玄哥","age" : "21"]
//增
dic["love"] = "镜子"
//改
dic["love"] = "小镜子"
//删
// dic.removeAll()
dic.removeValue(forKey: "age")
//遍历
for (key,value) in dic {
print(key,value)
}
10. where(条件)
这里where 不是循环,是判断条件!
// MARK: - where
func testDemo10() {
//where搭配switch语法的使用
let point = (1, 1)
switch point {
case let (x, y) where x == y :
print("特殊点",x,y)
break
default:
break
}
//where搭配for循环语法的使用
let items = [12,14,23,42,23,100]
for item in items where item > 99 {
print(item)
//结果:100
}
//从上面列子可以看出where就是一个条件选择
}
11. 函数(方法)
方法有很多种,我们举几个例子你就懂了
//函数的内部函数:在函数的内部再声明一个函数,并调用
func numOne() {
func numTwo(a: Int,b: Int) {
print(a * b)
}
//内部调用
numTwo(a: 2, b: 4)
}
普通的函数:
func numTwo {
print(普通的函数)
}
有参数的函数:
func getArea(a: Int,b: Int){
let res = a * b
print(res)
}
有参数有返回值的函数:
//求面积:
func getArea(a: Int,b: Int) -> Int {
return a * b
}
有参数有返回值的函数的升级版:
- width 表示外部参数 a 和 b 标识函数的内部参数只能够在内部使用
- 能够让函数的可读性更强,同时也能够让函数在内部使用参数更加简单
func getArea2(width a:Int,height b: Int) -> Int {
return a * b
}
总结:
这只是入门知识,把这些看懂后就可以写一些简单的demo了。
学习swift还有一个很好的教材,那就文档,很多不喜欢看文档最主要的原因是因为:看不懂英文。还好swift有中文版的文档:swift5中文文档
配合学习,加油 加油!!!
最后,附上这篇文上所有代码的demo:swift基础知识