Swift基本语法

1.常量和变量

常量用let修饰,定义之后值不以修改,变量用var修饰,定义之后值可以修改。
Swift中定义常量和变量不需要写数据类型, 编译器会根据后面的数据的真实类型自动推导
在Swift中,运算符不能直接跟在变量或常量的后面

var a = 10 
// 每一条语句后面可以不写分号,写上也不会报错,如果同一行有多条语句,那么每条语句后面必须写上分号
let a = 10; let a = 9.0
// option+点击变量名称  查看方法或者变量
// 不同类型之间不能直接进行计算,需要做转换
let x:Int = 10 // 指定数据类型
let y = 0.5
print(x + Int(y)) (print 相当于 OC中的NSLog, print性能更好)
 // => 10

命名规则: 可以使用几乎任何字符作为常量和变量名,包括Unicode,但是不能包含数字符号、箭头、无效的Unicode、横线-、制表符、且不能以数字开头。

let 中 = 10
print("中 = ", 中)
// => 中 =  10
var 下 = 1.9
下 = 2.0
print("下 = \(下)")
// => 下 =  2.0
图(1).png

2.数据类型转换

Swift中不存在隐式类型转换,所有的类型转换都必须是显示的

let num1 = 10
let num2 = 9.9
let sum = num1 + Int(num2)
print((num1, "+", num2, "=", sum)
// => 10 + 9.9 = 19
print(Double(num1) + num2)
// => 19.9

3. 可选项

使用Optional或者?,表示该常量/变量可能有值,也可能没有值。

// 1.定义可选项用 `Optional` 或者 `?`
/**
*  使用可选项类型如果直接打印可选类型,打印出来的值会被Optional包裹
*  !代表告诉编译器可选类型中一定有值,强制解析,如果可选类型中没有值又进行了强制解析,程序会报错
*/
let x:Optional = 10
let y:Int? = 20
print(x)
// => Optional(10)
print(x!)
// => 10
print(y)
// => Optional(20)
// 2.可选项参与计算的时候需要解包,使用 `!` 解包,从可选值中取出对应的非空值
print(x! + y!)
// => 30
// 3.可选绑定
// 会将num中的值取出赋值给year,如果不为nil,就进入{}
let num:Optional = "2021"
if let year = num {
    print(year)
}
// => 2021

4. 逻辑分支

Swift中的if的使用方式基本上和OC一致
Swift中的if中可以省略()但是必须加上{}
在C和OC中有非0即真;在Swift中条件只能放bool值,取值true/false

let n1 = 10
if (n1 == 10) {
      print("相等")
}
if n1 == 10 {
      print("相等")
}
三目的写法与OC基本一致
var a = 10; var b = 11
 a > b ?print("a > b"):print("a < b")
// => a < b
?? 是一个简单的三目,如果有值,就使用值,如果没值,就使用 ?? 后面的值
let c :Int? = nil
print(Int(n1) + (c ?? 0))   
// => 10
let d :Int? = 4
print(Int(n1) + (c ?? 0)) 
// => 14

switch

1.后面的()可以省略,每一个分支至少需要一条指令
2.OC中的switch如果没有break会继续执行,Swift中不需要添加break,如果需要多值用‘,’隔开
3.OC中如果要在case中定义变量,必须加上{}确定作用域,Switch中不用
4.OC中default的位置可以随便,只有case都不满足才会执行,Swift中的default只能放在最后
5.OC中的default可以省略,Swift中一般情况不能省略
6.OC中只针对整型进行分支,swift中可以针对任意类型的值

    let num = "June"
        switch num {
        case "January":
            let a = 31
            print("一月" + a.description + "天")
        case "February":
            print("二月")
        case "March":
            print("三月")
        case "April","May","June":
            print("第二季度")
        default:
            print("none")
        }
     // -> 第二季度

for循环

条件(0...5)之间不能出现空格

   // 0..<5,表示从0开始到5之间(不包含5)的数[0,5)
      for i in 0..<5 {
            print(i)
        }
      // => 0 1 2 3 4

      // 0...5,表示从0开始到5之间(包含5)的数[0,5]
        for i in 0...5{
            print(i)
        }
      // =>  0 1 2 3 4 5
      
      // _代表忽略,如果不要参数就可以使用_
        for _ in 0..<5 {
            print("1234")
          }
      // => 1234(打印5次)

repeat...while 相当于OC中的do...while

var n2 = 0
repeat {
    print(n2)
    n2 += 1  // Swift3.0中已经删除了 ++/--
} while n2 < 10
// -> 0
// -> 1
// -> 2
// -> 3
// -> 4
// -> 5
// -> 6
// -> 7
// -> 8
// -> 9

5.数组

数组的定义和初始化 OC: @[], Swift: []

  • OC 可变数组 NSMutableArray 不可变 NSArray
  • Swift 可变数组 var 不可变 let
var array1 = ["Jan","Feb","Mar","Apr","May","Jun"]
print(array1)
// => ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
// 初始化 [类型]()
var array2 = [String]()
array2.append("a")
print(array2)
// => ["a"]
var array3 = [Int]()
array3.append(12)
print(array3)
// => [12]
// 2.基本数据类型不需要包装 OC @[@(1),@(2)]
let array3 = [1,2,3,4,5]
print(array3)
// => [1, 2, 3, 4, 5]
// 3.数组的遍历
// a>按照下标遍历
for i in 0..<array1.count{
     print(array1[i])
}
// => Jan
// => Feb
// => Mar
// => Apr
// => May
// => Jun
for i in array1 {
      print(i)
}
// => 同上
// enumerated()函数 遍历 同时遍历下标和内容
for e in array1.enumerated() {
     print("\(e.offset) \(e.element)")
}
// => 0 Jan
// => 1 Feb
// => 2 Mar
// => 3 Apr
// => 4 May
// => 5 Jun
// enum 遍历 同时遍历下标和内容
for (index,value) in array1.enumerated() {
      print("\(index) \(value)")
}
// => 同上
// 反序遍历
for e in array1.reversed(){
      print(e)
}
// => Jun
// => May
// => Apr
// => Mar
// => Feb
// => Jan
// 4.数组添加元素 .append
array2.append("b")
array2.append("c")
print(array2)
// => ["a", "b", "c"]
// 5.数组修改元素
array2[1] = "d"
print(array2)
// =>  ["a", "d", "c"]
// 6.数组删除元素 .remove
array2.remove(at: 2)
print(array2)
// => ["a", "d"]
// 7.数组的合并 保证两个数组类型一致
array1 += array2
print(array1)
// => ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "a", "d"]

6.字典

字典的定义 OC @{} Swift中和数组一样使用 []

1.定义字典
var dict1 = [String:AnyObject]()  // 初始化一个空字典
var dict = ["123":"壹贰叁", "456":"肆伍陆", "789": 10] as [String : Any]
print(dict["123"])
// => Optional("壹贰叁")
2.字典的添加元素 (有则更新键值对,没有则添加)
dict["age"] = "你猜"
dict["789"] = 789
3.字典元素的修改
dict.updateValue(19, forKey: "789")
4.字典元素的删除
dict["789"] = nil
print(dict)
// => ["456": "肆伍陆", "age": "你猜", "123": "壹贰叁"]
dict.removeValue(forKey: "123")
5.字典的遍历
dict = ["789":"10", ""age"":"你猜", "456":"肆伍陆", "123":"壹贰叁"]
for value in dict {
      print(value)
}
// => (key: "789", value: 10)
// => (key: "age", value: "你猜")
// => (key: "456", value: "肆伍陆")
// => (key: "123", value: "壹贰叁")

// 利用元祖类型遍历字典,会自动将字典中的key赋值给元祖中的第一个变量,将value赋值给元祖中的第二个变量
// 第一个是key,第二个是value
for (key, value) in dict {
     print("\(key),\(value)")
}
// => 123,壹贰叁
// => age,你猜
// => 456,肆伍陆
// => 789,10
6.字典的合并
let dict2 = ["吃饭了":"好的","吃的啥":"你猜"]
for (key, value) in dict2 {
    dict[key] = value
}
print(dict)
// => ["123": "壹贰叁", "吃的啥": "你猜", "789": 10, "age": "你猜", "吃饭了": "好的", "456": "肆伍陆"]

7.字符串

OC中的字符串是NSString, Swift中的字符串是String
OC中的字符串是一个对象,继承于NSObject; Swift中的字符串是一个结构体
Swift中的字符串的性能比OC中的高

定义字符串
var str: String = "Hellow"
print(str.count) // str的长度
// => 6
String转化NSString
let ocString = str as NSString
print("ocString = \(ocString.length)")
// => ocString = 6
字符串的遍历(OC不支持遍历)
for s in str {
      print(s)
}
// => H
// => e
// => l
// => l
// => o
// => w
字符串的拼接 \(常量/变量)
var str: String = "Hellow"
let a2 = "World!"
str = "\(str)\(a2)\(20)"
print(str)
// => HellowWorld!20
str += "下班了"
print(str)
// => HellowWorld!20下班了
字符串的格式化
所有的值都必须放到数组中,只有一个值也需要放到数组中
let date = String(format: "%@年%@月%@日 %@:%@:%02d", arguments: ["2021", "07", "21", "19", "33", 56])
print(date)
// => 2021年07月21日 19:33:56
字符串的截取
let str = "Hellow World!"
let sub1 = str.prefix(3)
let sub2 = str.suffix(4)
print(sub1)
// => Hel
print(sub2)
// => rld!
let sub = String(str[str.index(str.startIndex, offsetBy: 2)..<str.index(str.startIndex, offsetBy: 5)])
print(sub)
// => llo

8.函数

函数数定义格式:
语义:将(参数列表)计算的结果返回给 -> 返回值
func 函数名称(参数列表) -> 返回值
{
执行代码
}

// 没有返回值没有参数,如果函数没有返回值就写Void
func say() -> Void
{
     print("hello")
}
say()
// => hello
func say() -> ()
{
    print("hello")
}
say()
// => hello
func say()
{
    print("hello")
}
say()
// => hello
// 有返回值没有参数
func getNum() -> Int
{
     return 999
}
print(getNum())
// => 999
// 有参数没有返回值
func sum2(a: Int, b: Int)
{
    print(a + b)
}
sum2(a: 2, b: 3)
// => 5
外部参数:就是在形参前面加一个名字
外部参数不会影响函数内部计算
x, y称之为外部参数,a, b称之为内部参数
func sum2(x a: Int, y b: Int)
{
      print(a + b)
}
sum2(x: 1, y: 2)
// => 3
外部参数如果使用 _ ,在外部调用函数时会省略形参的名字
func sum2(_ a: Int, _ b: Int) -> Int
{
      return a + b
}
print(sum2(10, 2))
// => 12
// 有参数有返回值
func sum2(a: Int, b: Int) -> Int
{
     return a + b
}
print(sum2(a: 10, b: 20))
// => 30
函数的默认值
给参数设置默认值,在调用的时候如果不设定值的,使用默认值。
func sum2(a: Int = 11, b: Int = 12) -> Int
{
      return a + b
}
print(sum2())
// => 23

9.闭包

闭包就是能够读取其他函数内部变量的函数,可以理解成定义在一个函数内部的函数。
简单的说它就是一个代码块,用{}包起来,他可以用在其他函数的内部,将其他函数的变量作为代码块的参数传入代码块中,在Swift中多用于回调。这个跟Object-C中的block是一样的。

闭包的使用场景:

  • 异步执行回调
  • 控制器件回调
  • 自定义视图回调
    闭包基本格式:
    {
    (形参列表) -> ()
    in
    需要执行的代码
    }
有参数有返回值
let aaa = { (x : Int, y: Int) -> Int in
       return x + y
 }
print(aaa(5, 5))
// => 10
有参数无返回值
let bbb = {(x: Int?) -> () in
       print((x ?? 0))
}
bbb(100)
// => 100
无参数无返回值
let ccc = {() -> () in
   print("无参数无返回值的闭包")
}
ccc()
// =>  无参数无返回值的闭包
let abc = {
     print("闭包")
}
// => 闭包

10.元组

元组(tuples)是把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型
元组类型的值的语法格式为:(元素1, 元素2, ..., 元素n)。

1. 使用索引值访问(索引值从0开始)
let turple = ("张三", 19, true)
print(turple.0)
print(turple.1)
print(turple.2)
// => 张三
// => 19
// => true
2. 为元组中的元素指定名字,然后使用指定的名字访问。
let turple2 = (name: "张三", age: 18, isMarried: true)
print(turple2.name)
// => 张三
let turple: (name: String, age: Int, isMarried: Bool) = ("张三", 19, true)
print(turple.age)
// => 19
把元组中的元素分解成多个变量或常量,然后使用变量名或常量名访问。
可以使用这种方式同时声明并初始化多个变量或常量。
let (name, age, isMarried) = ("张三", "19", true)
print(name);
print(age)
print(isMarried)
// => 张三
// => 19
// => true
使用元组类型来定义元组变量
var score : (Int, Int, String, Double)
为元组变量赋值时必须为所有成员都指定值
score = (98, 89, "及格", 20.4)
print(score.0)
print(score.2)
// => 98
// => 及格
元组的成员又是元组
var test:(Int, (Int, String))
test = (20, (15, "老张"))
print(test.1.1)
// => 老张
将元组拆分成多个变量, 数量必须相同, 忽略元组用_
let turple: (name: String, age: Int, isMarried: Bool) = ("张三", 19, true)
var (height, weight, _) = turple
print(height)
print(weight)
// => 张三
// => 19
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 常量&变量 什么是常量和变量 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用l...
    去兜风喽阅读 571评论 0 0
  • YES 2014WWDC发布 常量和变量使用注意 在实际过程中,建议先定义常量,如果需要修改再改变为变量(更加安全...
    南冯阅读 548评论 0 0
  • 作品链接://www.greatytc.com/users/1e0f5e6f73f6/top_articl...
    打电话记错号码的人阅读 1,020评论 0 9
  • 1.新建Xocode Swift 程序 2.(基本使用) 在Swift中没有.h 和.m文件 只有一个.Swift...
    圆小米123阅读 1,640评论 0 7
  • 目录一、常量与变量二、数据类型三、特有的运算符四、流程控制语句 一、常量与变量 常量是指第一次赋值后,不能再次赋值...
    意一ineyee阅读 1,157评论 0 6