Swift5.x入门01 -- let,var,初始可选项,数据类型,类型转换,字面量,元组

  • 在Mac终端输入 swift可查看当前系统所支持的Swift语言的版本,如下所示:
  • 在Mac终端输入 xcrun swift -version,可查看Xcode版本对应的Swift版本,如下所示:
image.png
  • 在Mac终端输入 xcodebuild -showsdks,可查看Xcode所支持的系统版本,如下所示:
image.png

Swift初次体验

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let a = 100; let b = 200
        print(a+b)
        
        let view1 = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        view1.backgroundColor = UIColor.red
        view.addSubview(view1)
        
        let button = UIButton(type: UIButton.ButtonType.contactAdd)
        button.center = view.center
        button.addTarget(self, action: #selector(click(button:)), for: UIControl.Event.touchUpInside)
        view.addSubview(button)
    }
    
    //按钮的监听回调
    @objc func click(button: UIButton){
        print("点击")
    }
}
  • 在Swift中,一段代码之后不需要分号,在OC中需要;
  • 在Swift中,若多个语句并列,之间要加分号;例如let a = 100; let b = 200
  • 在Swift中, () 代表构造函数 ,创建并初始化对象,相当于OC中 alloc init
  • 在Swift中,写括号时,先只写一个左括号,会有代码提示
  • 在Swift中,获取系统颜色:UIColor.red 相当于OC中[UIColor redColor];
  • 在Swift中,可以省略 self. 也可以加上,个人建议不要加上,在闭包中必须加上 self.
  • 在Swift中,print函数相当于OC中NSLog函数,其执行效率更高;
  • 在Swift中,按钮添加监听方法,#selector(方法名()),如果有参数需添加冒号 #selector(方法名(参数:))

常量与变量

  • 常量,一旦定义初始化了,就不能再修改,用关键字let修饰,否则会报错Immutable value 'x' may only be initialized once
  • 常量的值不要求在编译期确定,但使用之前必须赋值一次
  • 变量,定义初始化了,可以多次修改,用关键字var修饰;
  • 常量与变量在初始化之前,是不能使用的,如果使用会报错
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //定义常量
        let x = 20
        //x = 80

        //定义变量
        var y = 40
        y = 50
        
        print(x+y)
        
        //view1初始化
        let view1 = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        view1.backgroundColor = UIColor.green
        view.addSubview(view1)
    }
}
  • 控件view1初始化之后用let修饰,后面修改了其属性,并没有修改指针的地址,即view1始终指向UIView的实例对象,所以可以用常量let修饰;

类型的自动推导

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let x = 20
        let y = 3.5
        
        let r1 = x + Int(y)
        let r2 = Double(x) + y
        let r3 = x + y
        
    }
}
  • 发现 let r3 = x + y这行代码报错;
  • 按住option键,再左点击x,发现常量x的类型为Int,我们并没有声明常量x的类型,但它的类型已经被确定为Int整型,是因为Swift语言的中自动推导,会根据设置数值的右侧代码,推断出常量/变量的数据类型
  • 在Swift中任何两个不同类型的变量或者常量,是不允许直接计算,这就是为什么let r3 = x + y报错的原因,要想计算必须进行数值类型的转换,转成同一种类型,才能进行计算;
  • let r3 = x + y这行代码报错也证明:在Swift中,在任何时候,变量或者常量都不会做隐式转换
  • Swift是一个对数据类型要求异常严格的语言;
  • Int --> 64位整数 相当于OC中 long;
  • Double --> 双精度的小数,相当于OC中 CGFloat;

初识可选项Optional

  • 可选项:表示一个变量可以为本身类型,也可以为nil
  • 定义一个常量或者变量,如果需要指定其类型,可使用 常量/变量 : 类型 的方式指定其准确的类型;
  • 可选项 使用 ? 进行定义;
  • 可选项Optional可视为一种数据类型;
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let x : Double = 20
        print(x)
        
        var y : Int?
        print(y)

        y = 30
        print(y)
    }
}
  • let x : Double = 20:指定了常量x的类型为Double;
  • var y : Int? :定义变量y为可选项类型,那么变量y可以是一个整数,也可以是nil,在未初始化时默认情况下是nil
  • y = 30:对变量y进行赋值,可选项在输出的时候,会提示Optional,调试结果如下:
Snip20210424_24.png
  • 使用可选项的变量,其值可能有两种类型,一种是本身类型,另一种是nil,所以在Swift中可选项是不能直接参与运算的
  • ! 感叹号 --> 在Swift中表示强行解包(unwrapping)进行解包操作时一定要保证可选项变量有值,才能解包成功,否则就会出现崩溃
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var x : Int?
        x = 30
        print(x!+20)
    }
}
  • var x : Int?:x为可选项,然后初始化为30;
  • x! 强制解包,获取x的值,然后参与运算;
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var x : Int?
    }
}
  • var x : Int? :定义了一个可选项变量x,出现警告Variable 'x' was never used; consider replacing with '_' or removing it ,是说x没有被使用,建议直接移除,现做如下修改:
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var x : Int?
        x = 30
    }
}
  • 可选项变量x 对其初始化为30,依然出现警告Variable 'x' was written to, but never read 表示 x 只做了写的操作,没有进行读取操作,再作修改如下:
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var x : Int?
        x = 30
        print(x)
    }
}
  • 可选项变量x 定义且初始化后,再读取打印其值,还是出现警告Expression implicitly coerced from 'Int?' to 'Any' 解决方案:在使用x值的时候使用强制解包,修改如下:
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var x : Int?
        x = 30
        print(x!)
    }
}
  • 这样就完美了,没有任何警告,再看一种情况如下:
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var x : Int?
        print(x!)
    }
}
  • 运行直接崩溃,报错Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
  • 上面已经提到可选项变量强行解包(unwrapping) 表明可选项修饰的变量一定有值,如果没有,就会出现崩溃,这里的x没有初始化其值默认为nil,所以出现崩溃;
  • 所以可选项变量在使用!强行解包的时候,要确保变量一定有值,下面来看一段代码:
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let x : Int?
        if x != nil {
            print(x!)
        }
    }
}
  • if x != nil 执行会报错,提示Constant 'x' used before being initialized,表明可选项常量x在使用之前必须要初始化,否则会报错
  • 若将let 改成var,就不会报错了,这是因为可选项变量在定义的时候若没有初始化,会默认初始化为nil
总结:
  • var的可选项默认值是nil
  • let的可选项是没有默认值的,必须要初始化值,否则访问会报错
  • 无论var还是let,在使用之前必须初始化,否则直接使用就会崩溃;

?? 操作符

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var x : String?
        x = "liyanyan"
        
        if x != nil {
            print(x! + "好")
        }
        
        print((x ?? "空的") + "也好")
    }
}
  • ??操作符:表示判断变量是否为nil,若为nil,则使用后面的字符进行替换;
  • 上面代码的执行结果为:liyanyan好 liyanyan也好
  • 若将x = "liyanyan"移除,执行结果为空的也好

标识符

  • 标识符(比如常量名,变量名,函数名)几乎可以使用任何字符;
  • 标识符不能以数字开头,不能包含空白字符,制表符,箭头等特殊字符;
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //: # 一级标题
        🙂()
        let 😎 = "hehe"
        print(😎)
        var 😍 = "like"
        print(😍)
    }

    func 🙂() {
        print("haha")
    }
}

常见的数据类型

  • 值类型

    • 枚举(enum):可选项Optional
    • 结构体(struct):Bool,Int,Float,Double,Character,String,Array,Dictionary,Set
  • 引用类型

    • 类(class)
  • 整数类型:Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32,UInt64

    • Int8:占8位一个字节;
    • UInt8: 无符号占8位一个字节;
    • 在32位平台,Int等价于Int32;在64位平台,Int等价于Int64;
    • 整数的最值:UInt8.max,Int16.min
    • 一般情况下,都是直接使用Int;
  • 浮点类型:Float是32位的,精度只有6位;Double是64位的,精度至少15位;

字面量

  • 布尔:let bool = true
  • 字符串:let str = "liyanyan"
  • 字符:let char : Character = "1";必须指明其类型位 为Character,否则默认为字符串;
  • 整数:
    • 十进制:let a = 17
    • 二进制:let b = 0b0001
    • 八进制:let c = 0o21
    • 十六进制:let d = 0x11
  • 浮点数:
    • 十进制:let a = 125.0,等价于1.25e2;
    • 十六进制 let b = 0xFp2,等价于15*2^2 = 60.0;p是特殊字符表示幂运算;
  • 十六进制 let b = 0xFp-2,等价于15*2^-2 = 3.75;F是十六进制等于15;
  • 整数和浮点数可以添加额外的零或者下划线来增强可读性;
  • 100_0000 :表示100万
  • 数组:let arr = [1,2,3]
  • 字典:let dic = ["age":13,"name":"liyanyan"]

类型转换

  • 整数转换
let int1:UInt16 = 2_000
let int2:UInt8 = 1
//将int2 -- 转成UInt16 同种类型才能运算
let int3 = int1 + UInt16(int2)
  • 整数,浮点数转换
let int = 10
let double = 0.1234
let p = Double(int) + double
  • 字面量是可以直接运算的,因为字面量本身没有明确的类型
let result = 3 + 0.1234

元组(tuple)

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let error = (404,"Not Found")
        print(error.0)
        print(error.1)
        
        let (statuCode,StatuMsg) = error
        print(statuCode)
        
        let (statuCode1,_) = error
        print(statuCode1)
        
        let error1 = (statuCode:200,desc:"OK")
        print(error1.statuCode)
        print(error1.desc)
    }
}
  • let error = (404,"Not Found"):是一个元组,内部包含两种数据类型,整型与字符串,内部元素可通过下标进行访问;
  • let (statuCode,StatuMsg) = error:元组之间可以赋值
  • let (statuCode1,_) = error:元组之间可以赋值,对于不需要的数据项可以使用_进行忽略;
  • let error1 = (statuCode:200,desc:"OK"):元组内部元素的前面可添加参数,以后访问可以通过参数进行访问;

关于自增运算

  • 在swift3中去除了自增,自减运算;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容