欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS-Swift3常用语法

程序员文章站 2022-05-11 14:45:34
常量和变量 在swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用let来定义常量,定义之后不可以修改 使用var来定义变量,定义之后可以修改 //定义标示符表明是变...

常量和变量

在swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量
使用let来定义常量,定义之后不可以修改
使用var来定义变量,定义之后可以修改

//定义标示符表明是变量还是常量!
//let  常量
let age : int = 24
//var  变量
var name = "qiuxuewei"
var pi:double = 3.1415

注意事项:
常量:是指向的对象不可以再进行修改.但是可以通过指针获得对象后,修改对象内部的属性
在真实使用过程中,建议先定义常量,如果需要修改再修改为变量(更加安全)

//定义常量view 和 btn 可以利用指针指向的不可修改的对象,对对象内属性进行更改,推荐使用let定义常量
let view = uiview(frame: cgrect(x: 16, y: 64, width: 100, height: 100))
view.backgroundcolor = uicolor.red

let btn = uibutton(type: uibuttontype.custom)
btn.frame = cgrect(x: 8, y: 8, width: 64, height: 64)
btn.settitle("确定", for: uicontrolstate.normal)
btn.backgroundcolor = uicolor.green
view.addsubview(btn)

swift中数据类型

swift中的数据类型也有:整型/浮点型/对象类型/结构体类型等等
整型

有符号

常用:int : 和平台相关(默认,相当于oc的nsinteger)
int8 : 有符号8位整型
int16 : 有符号16位整型
int32 : 有符号32位整型
int64 : 有符号64位整型

无符号

uint : 和平台相关(常用,相当于oc的nsuinteger)(默认)
uint8 : 无符号8位整型
uint16 : 无符号16位整型
uint32 : 无符号32位整型
uint64 : 无符号64位整型

浮点型

float : 32位浮点型
double : 64浮点型(默认)

// 定义一个int类型的变量m,并且赋值为10
var m : int = 10
// 定义一个double类型的常量n,并且赋值为3.14
let n : double = 3.14

swift是强类型的语言
swift中任何一个标识符都有明确的类型
即如果将一变量定义为整型,就不可对他进行浮点型的赋值

// 定义变量时没有指定明确的类型,但是因为赋值给i一个20.20为整型.因此i为整型
var i = 20
// 错误写法:如果之后赋值给i一个浮点型数值,则会报错
// i = 30.5

// 正确写法
var j = 3.33
j = 6.66

swift中在进行基本运算时必须保证类型一致

//对不同类型的变量/常量进行运算需要将其转化为相同类型的
let a = 20
let b = 13.14
let c = double(a) + b
print(c)

逻辑分支

分支即if/switch/三目运算符等判断语句,通过分支语句可以控制程序的执行流程

if语句

在swift的判断句中必须有明确的真假
不再有非0即真
必须有明确的bool值
bool有两个取值:false/true

//判断句必须有真假值
var d:int = 2;
if d != 0 {

}else{

}

var score = 99
if score < 60 {
    print("不及格")
}else if score < 80{
    print("及格")
}else if score < 100{
    print("优秀")
}else{
    print("毕业")
}

//可选类型,因为只有声明成可选类型后,才可以判断是否为空
let ifview :uiview? = uiview();

if ifview != nil{
    print("有")
}else{
    print("没有")
}

三目运算符

跟oc格式保持一致

//三目运算符
a == score ? a : score

guard

guard是swift2.0新增的语法
它与if语句非常类似,它设计的目的是提高程序的可读性
guard语句必须带有else语句,它的语法如下:
当条件表达式为true时候跳过else语句中的内容,执行语句组内容
条件表达式为false时候执行else语句中的内容,跳转语句一般是return、break、continue和throw

guard 条件表达式 else {
    // 条换语句
    break
}
语句组
//guard
var age = 18
func online(age:int) -> void{
    guard age >= 18 else {
        print("回家去")
        return
    }
    print("可以上网")
}
online(age: age)

switch

//switch 用法
//sex:0 -> 男  sex:1 -> 女
let sex = 0
//普通用法 - case后可以不跟break(默认会有break)
switch sex{
case 0:
    print("男")
case 1:
    print("女")
default:
    print("未知")
}

//可判断多个值
switch sex{
case 0,1:
    print("正常人")
    //如果case穿透需要加此关键字
//    fallthrough
default: break
//    print("不正常")
}

//如果希望出现之前的case穿透,则可以使用关键字fallthrough
let sex = 0

switch sex {
case 0:
    fallthrough
case 1:
    print("正常人")
default:
    print("其他")
}

//浮点型的switch判断
let f = 3.14
switch f {
case 3.14:
    print("π")
default:
    print("not π")
}

//可判断字符串
let sexstr = "人妖"
switch sexstr {
case "男":
    print("男")
case "女":
    print("女")
default:
    print("人妖")
}

//区间判断
//swift中的区间常见有两种
//开区间:0..<10 表示:0~9,不包括10
//闭区间:0...10 表示:0~10
score = 59
switch score{
case 0..<60:
    print("不及格")
case 60..<80:
    print("及格")
case 80...100:
    print("优秀")
default: break
}

循环

for循环

在swift3以后摒弃了c语言常用的 var i = 0; i < 6; i++ 格式

//for 循环
//0-4循环
for i in 0 ..< 5  {
    print(i)
}
//0-5循环
for i in 0 ... 5  {
    print(i)
}
//2次循环不需要变量
for _ in 0 ..< 3{
    print("hello world!")
}

while循环

while的判断句必须有正确的真假,没有非0即真

var aa = 0
while aa < 10 {
    //在swift3以后摒弃了 a++ 操作 改为 a+=1
    aa += 1
}
print(aa)

repeat while循环

swift中将 do-while 改为 repeat-while

var bb = 0
repeat {
    print(bb)
    bb += 1
} while bb < 10

字符串

oc和swift中字符串的区别
在oc中字符串类型时nsstring,在swift中字符串类型是string
oc中字符串@”“,swift中字符串””
使用 string 的原因
string 是一个结构体,性能更高
nsstring 是一个 oc 对象,性能略差
string 支持直接遍历
swift 提供了 string 和 nsstring 之间的无缝转换

//字符串
let str = "i am qiuxuewei"

//遍历字符串
for cc in str.characters{
    print(cc)
}

//字符串截取 将string转化为nssring 操作 (xxx as nsstring)
let myname = (str as nsstring).substring(from: 5)


//字符串与其他类型数据拼接
let tempheight : double = 1.83
let tempheight1 = "身高 \(tempheight) cm"
let tempheight2 = "身高" + "\(tempheight)" + "cm"

//字符串格式化 - 用于保留n位小数或格式化时间格式
let min : int = 9;
let doc : int = 8;

//let time : string = string(format: <#t##string#>, arguments: <#t##[cvararg]#>)
let time: string = string(format: "%02d分 : %02d秒", arguments: [min, doc])

数组

数组(array)是一串有序的由相同类型元素构成的集合
数组中的集合元素是有序的,可以重复出现
swift中的数组
swift字典类型是array,是一个泛型集合

数组分成:可变数组和不可变数组
使用let修饰的数组是不可变数组
使用var修饰的数组是可变数组

//数组
//b不可变数组
let arr1 : [string] = ["邱学伟","王珂惠","妈妈"]
let arr2 = ["邱学伟","王珂惠"]
let arr3 = ["邱学伟","烟台大学","不羁阁","疯火科技"]

//可变数组
var arrm1 = arr3;
var arrm2 : [any] = ["身高",1.83 ]


//添加元素
arrm1.append("10000000")

//删除元素
//删除最后一个元素并且会把最后一个元素返回
arrm1.removelast()
//移除指定下标元素
arrm1.remove(at: 0)


/遍历数组
//通过下标遍历
for i in 0..

字典

字典允许按照某个键来访问元素 字典是由两部分集合构成的,一个是键(key)集合,一个是值(value)集合 键集合是不能有重复元素的,而值集合是可以重复的,键和值是成对出现的 swift中的字典 swift字典类型是dictionary,也是一个泛型集合

swift中的可变和不可变字典 使用let修饰的数组是不可变数组 使用var修饰的数组是可变数组

//字典
//不可变字典
let dict1 : dictionary = ["name":"邱学伟" as anyobject,"age":24 as anyobject]
let dict2 : [string : anyobject] = ["name" : "邱学伟" as anyobject, "height" : 1.83 as anyobject]
let dict3 : [string : any] = ["name" : "邱学伟", "age" : 24]

//可变字典
var dictm1 : dictionary
var dictm2 : [string : any]
var dictm3 = ["name" : "邱学伟", "age" : 24] as [string : any]

//操作字典
//增
dictm3["height"] = 1.83

//删
dictm3.removevalue(forkey: "age")

//改
dictm3["老婆"] = "王珂惠"

//遍历字典
//key
for key in dictm3.keys{
//    print(key)
}

//value
for value in dictm3.values {
//    print(value)
}

//key和value
for (key,value) in dictm3 {
    print(key , value)
}

//字典合并
var dictm4 = ["学历" : "本科","电话" : "110"] as [string : any]
for (key,value) in dictm3 {
    dictm4[key] = value
}

元祖

swift新增数据类型 类似于数组或者字典 可以用于定义一组数据

//定义元组 常用作函数的返回值
let tuple2 = (crazyfire1 : "zar",crazyfire2 : "扩散",person : 6) //常用的定义方法 
let tuple1 = ("zar","扩散","wish",6);
let (crazyfire1,crazyfire2,person1,personnumber) = ("zar","扩散","wish",6)

//用法
tuple2.crazyfire1

let error = (errorcode : 404, errorinfo : "not found")
print(error.errorcode)
print(error.errorinfo)

可选类型

在oc开发中,如果一个变量暂停不使用,可以赋值为0(基本属性类型)或者赋值为空(对象类型) 在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强语言) 但是开发中赋值nil,在所难免.因此推出了可选类型

可选取值: 有值/空值

//可选类型
//错误写法!//var optionalnameerror : string = nil
//正确定义写法
//定义方法1:
var optionalnameright : string? = nil
//定义方法2:
var optionalname : optional
class person{
    var optionalname : optional
}

//可选类型拆包
optionalname = "xiaoming"

//一般在拆包时需要对可选类型进行判断,是否为空
//此种写法容易产出崩溃点
let xxxname = "呵呵哒的" + optionalname!

//定义
var phonenum : string?


phonenum = "+86 110"

//swift中如果进行强制解包操作会崩溃,所以在解包的时候需要进行判断
if phonenum != nil{
    var changephonenum = "new" + phonenum!
}

//可选绑定,判断phonenum是否有值,1如果没有值直接跳过,2如果有值拆包后将值赋值给tempphonenum
if let tempphonenum = phonenum {
    print("解包后有值")
}

//可选类型应用场景
let urlstring = "www.qiuxuewei.com"
let url : nsurl? = nsurl(string: urlstring)

//创建nsrequest对象
//需要先判断可选类型数据是否有值
if url != nil{
    let request = nsurlrequest(url: url! as url)
}

if let tempurl = url {
    let request = nsurlrequest(url: tempurl as url)
}

函数

即为oc中的方法 定义格式:

func 函数名(参数列表) -> 返回值类型 {
    代码块
    return 返回值
}

函数的四种类型:

//函数
//1.没有参数,没有返回值
func run() -> void{
    print("跑跑跑...")
}
run()

//其中如果函数木有返回值, " -> void "可以省略!
func run2() {
    print("省略后,跑跑跑...")
}
run2()


//2.有参数,没有返回值
func callphone(phone : string) -> void{
    print("打电话给 \(phone)")
}
callphone(phone: "110")

func callphone2(phone : string){
    print("打电话给 \(phone)")
}
callphone2(phone: "119")

//3.没有参数,有返回值
func readmsg() -> string{
    return "今天早起学习了么?"
}
print(readmsg())

//4.有参数,有返回值
func add(number1 : double, number2 : double) -> double{
    return number1 + number2
}
print(add(number1: 100, number2: 9.99))

默认参数 某些情况,如果没有传入具体的参数,可以使用默认参数

//默认参数
func makesport(type : string = "篮球") -> void{
    print("打\(type)")
}
makesport()
makesport(type:"排球")

可变参数 swift中函数的参数个数可以变化,它可以接受不确定数量的输入类型参数 它们必须具有相同的类型 我们可以通过在参数类型名后面加入(…)的方式来指示这是可变参数

//可变参数
func sum(numbers : double...) -> double{
    var total : double = 0.00
    for number in numbers {
        total += number
    }
    return total
}
print(sum(numbers: 1,2,3))

引用类型(指针的传递) 默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要在函数内部将传递值设置为变量 因为需要在内部改变其值

//交换两个值
//值传递
func swap1( a:double, b:double){
    var b = b
    var a = a

    let temp = a
    a = b
    b = temp

    print("交换后: a\(a) ,b\(b)")
}
swap1(a: 1, b: 9)

//类
class person : nsobject{

    //存储属性
    //1>如果类型是结构体或类,定义为可选类型
    //2>如果是基本数据类型,定义时直接初始化0 / 0.0
    var name : nsstring?
    var age = 0
    var height = 0.00

}

class student : person {

    //存储属性
    var chinesescore = 0.0
    var mathscore = 0.0

    //计算属性,由其他属性值计算而来
    var totalscore : double{
        //可省略get
//        get{
            return chinesescore + mathscore
//        }
    }

    var avgscore : double{
        return ( chinesescore + mathscore ) * 0.5
    }

    //类属性,设置或者获取属性值必须通过类名进行获取
    static var scorecount : int = 2;
}

let stu = student();
stu.name = "邱学伟"
stu.age = 18
stu.chinesescore = 119
stu.mathscore = 120
stu.totalscore
stu.avgscore
student.scorecount

自定义构造函数

class animal : nsobject{
    var type : string?
    var name : string?

    //自定义构造函数
    init(type : string, name : string) {
        self.type = type;
        self.name = name;
    }
}

let cat = animal(type: "猫", name: "咪咪")
cat.type
cat.name

字典转模型式自定义构造函数

//字典转模型 构造方法
class dog : nsobject{
    var master : string = ""
    var age : int = 0

    init(dict : [string : any]) {
        self.master = dict["master"] as! string
        self.age = dict["age"] as! int
    }
}
let 哈士奇 = dog(dict: ["master" : "邱学伟", "age" : 10])
哈士奇.master
哈士奇.age

swift支持类的继承,此写法是继承自其他类本类的构造方法

//字典转模型 构造方法
class dog : animal{
    var master : string = ""
    var age : int = 0

    init(dict : [string : any]) {
        super.init(type: "猫科", name: "二哈")
        self.master = dict["master"] as! string
        self.age = dict["age"] as! int
    }
}
let 哈士奇 = dog(dict: ["master" : "邱学伟", "age" : 10])
哈士奇.type
哈士奇.name
哈士奇.master
哈士奇.age

类的运算符重载

java中熟悉的语法,大多数人都不会陌生 注意在自定义的类中不可以继承自nsobject, nsobject是用oc封装的,有大量oc语法特性.

class person: anyobject {
    //运算符重载:
    func sum(num1 : int,num2 : int) -> int {
        return num1 + num2
    }
    //参数类型不同
    func sum(num1 : double,num2 : double) -> double {
        return num1 + num2
    }
    //参数个数不同
    func sum(num1 : int,num2 : int,num3 : int) -> int {
        return num1 + num2 + num3
    }
}