swift枚举 分支结构 函数 结构体 类

枚举

// swift中的枚举值,描述的不仅仅是无符号整型值,可以是符合swift的各种数据类型,比如字符型,浮点型等等。

enum Season {

    case Spring
    case Summer
    case Autumn
    case Winter
}

var s = Season.Spring

print(s)

enum TheEightDiagrams:String {
case 乾 = "天"
case 坤 = "地"
case 巽 = "风"//(xun)
case 震 = "雷"
case 坎 = "水"
case 离 = "火"
case 艮 = "山"//(gen)
case 兑 = "泽"
}

// 可变枚举变量

var diagram = TheEightDiagrams.坤

// 枚举值打印

print(diagram)  // 结果:坤

// 枚举值所代表的值

print(diagram.rawValue)  // 结果:地

分支结构

// if

if diagram.rawValue == "地" {

    print("拣尽寒枝不肯栖,寂寞沙洲冷")
}

let number = 10
if number > 20 {

    print("这个数比20大")
}else if number < 15 {

    print("这个数比15小")
}else {

    print("我也不知道了......")
}

// switch...case
// ①switch观察的量可以是任意类型,包括但不限于数值型
// ②swift中switch语句的特点:默认不贯穿(自带break),要求罗列的每一种情况都要有处理语句,default要书写并做处理。

switch diagram.rawValue {

    case "天":
        print("天行健,君子以自强不息")
    case "地":
        print("地势坤,君子以厚德载物")
    case "风":
        print("风好大")
    default:
        print("此卦无解......")
}

var rect = (20,30)
switch rect{

    case (20,_):
        print("case1")
        fallthrough // 人为贯穿
    case (_,30):
        print("case2")
        fallthrough
    case (_,_):
        print("case3")
        fallthrough
    case (_,40):
        print("case4")
        fallthrough
    default:
        print("其他情况")
}

var num = 89757
switch num{
    // 在条件语句中,当where后面的语句满足条件时,前面的变量会被定义,并且可以使用(在保持原值不改变的情况下,可以使用新的量来替代原值参与计算)
case var a where num > 4096 :
    
    a += 10
    
    print(a)
    
    fallthrough
default:
    print(num)
}

函数

// 1.无参无返回值

func test1()->Void{

    print("相顾无言,唯有泪千行")
}

test1()

// 2.无参有返回值

func test2()->String{

    return "太上老君急急如律令"
}

print(test2())

// 3.有参无返回值
// nameArray 外部参数:用于告知外界参数描述(可以为汉字)
// names 内部参数:函数内部使用的参数

func test3(nameArray names:Array){

    for name in names{
        print(name)
    }
}

let names = ["鑫","森","淼","焱","垚"]//(miao,yan,yao)
test3(nameArray: names)

// 4.有参有返回值
// 注意,在函数拥有多个参数前提下,从第二个开始,将默认变成外部参数,若想改变这一点,需要使用"_"来修饰以后的参数

func num(num1:Int,_ num2:Int) -> Int{

    return num1 * num2
}
print(num(12345679, 8))

// 练习->斐波那契数列:1,1,2,3,5,8,13,21,34,56

func numberFor(需要计算的第几个数 count:Int) -> Int{
    if count < 3{

        return 1
    }else{

        return numberFor(需要计算的第几个数: (count - 1)) + numberFor(需要计算的第几个数: (count - 2))
    }
}
print(numberFor(需要计算的第几个数: 10))


func arrayFor(斐波那契额数列的个数 count:Int) -> Array{

    var array = Array()
    for i in 1...count{

        array.append(numberFor(需要计算的第几个数: i))
    }
    return array
}

print(arrayFor(斐波那契额数列的个数: 20))

// 有参多个返回值(返回值为元组)

func test4(name:String) -> (name:String,age:Int,score:Float){

    return(name:"马泽坤",age:19,score:59.9)
}
print(test4(""))

// 练习 阶乘

func factorial(number n:Int) -> Int{

    if n == 1 {

        return 1
    }else{

        return n * factorial(number: n - 1)
    }
}
print(factorial(number: 5))


var a = 10, b = 11

// 补存点:
// ①默认内部参数使用let修饰,无法对参数本身进行修改
// ②若需要通过函数来修改外部变量的值,需要使用inout修饰(本质上是量的地址传递)

func exchange(inout a:Int,inout _ b:Int){

    var temp = 0
    temp = a
    a = b
    b = temp
}
exchange(&a, &b)
print("a = \(a),b = \(b)")

// 必须有值才能解包,实际开发中写if
// 可选类型,可以不给初始值,但解包才可以获取其表示的值

var x:String?
x = "xxx"
print(x!)

// !表示强制解包,若值为空时,解包会崩溃,所以必须在确定其有值的前提下解包
// 可选绑定,可以不给初始值,不需要解包,若值为空时,一样会崩溃,所以必须在确定其有值的前提下获取值

var y:String!
y = "yyy"
print(y)

结构体

struct Point{
    var x:Float?
    var y:Float?
}
var p1 = Point(x:100,y:200)
print(p1.x!)


struct Size {
    var width:Float?
    var height:Float?
}


struct Frame {
    var point:Point?
    var size:Size?
    // 计算属性
    var centerX:Float{

        get{
            return (point?.x)! + (size?.width)!/2
        }    
    }
}

var frame = Frame(point: Point(x:100,y:100), size:Size(width:100,height:100))
print(frame.centerX)



struct Person {
    // 结构体的成员变量(相当于类的实例变量)
    var name:String
    var age:Int
    var gender:String
    // 结构体成员变量方法(相当于类的实例方法)
    func sayHi(){
        print("你好,你见过这么大的月亮么?")
    }
    // 结构体属性
    static var soul:String?
    // 结构体方法
    static func think(){

        print("t将来的你会感谢现在奋斗的自己!")
    }

    // 计算属性:本身作为一个属性,并无实际意义,但可以进行对成员变量的取值和赋值等操作
    var value:String{
        // 类似于setter方法
        set{
            // 给name赋值
            name = newValue// 代指外界赋的新值
        }
        // 类似于getter方法
        get{
            // 返回name
            return name
        }
    }
}

// 创建结构体变量

var person1 = Person(name: "雷文豪", age: 15, gender:"?")

// 对结构体变量单独赋值

person1.gender = "!"

// 调用实例方法

person1.sayHi()

// 使用计算属性赋值(相当于给name赋值)

person1.value = "岳桂庆"

// 使用计算属性取值(相当于向name取值)

print(person1.value)

// 结构体属性赋值

Person.soul = "如果要求唯有循规蹈矩的、道德上四平八稳的灵魂才能在艺术中表现自己"

// 结构体方法调用

Person.think()

class Animal{
    // 实例变量
    var name:String?
    var age:Int?
    var gender:String?
    // 实例方法
    func calculation(){

        print("小动物学画画")
    }

    // 类属性
    static var hair:Bool?
    // 类方法
    // 使用static修饰的类方法,子类不可以重写
    // 使用class修饰的类方法,子类可以重写
    class func drink(){
        print("动物都爱喝好喝的")
    }

    // 初始化方法(自定义)
    // ①当前类为根类时,不需要向super发送消息
    // ②默认初始化方法无参数,自定义初始化方法可以自己书写参数,但是两者在书写时都没有返回值
    init(name:String,age:Int,gender:String){

        self.name = name
        self.age = age
        self.gender = gender

    }
}

class Cat: Animal {
    // 子类扩充的实例变量
    var color:String?

    // 子类的初始化方法
    init(name: String, age: Int, gender: String, color: String) {
        // 向父类发送消息,让父类初始化公共的实例变量
        super.init(name: name, age: age, gender: gender)
        // 子类单独初始化独有的实例变量
       self.color = color
    }

    // 覆写父类的方法
    // 覆写实例方法
    override func calculation() {
    
        super.calculation() // 父类原本的操作
        print("这是一只小猫在计算") // 子类添加的操作
    }
    // 覆写父类方法
    override class func drink(){

        super.drink() // 父类原本的操作
        print("这是一只饥渴的小猫")
    }
}

// 创建一个Animal实例

var animal = Animal(name:"折耳猫",age:2,gender:"M")
var _animal = Animal.init(name: "折耳猫", age: 2, gender: "M")

//animal.name = "折耳猫"
//animal.age = 2
//animal.gender = "M"

// 调用实例方法

animal.calculation()

// 类属性赋值

Animal.hair = true

// 调用类方法

Animal.drink()

// 创建一个Cat的实例

var cat = Cat.init(name: "小猫", age: 1, gender: "M", color: "yellow")
print(cat.name!)

// 子类实例可以继承父类的静态方法和动态方法

cat.calculation()
Cat.drink()

值类型

// 1.简单值类型

var num1:Int = 10
var num2 = num1
num2 = 20
print(num1)

// 2.构造值类型

var point1 = Point(x: 20, y: 20)
var point2 = point1
point2 = Point(x: 30, y: 30)
print(point1)

// 引用类型:在进行复制的传递时,为了节省资源,或者保证访问统一资源,指向了同一内存区域(类似于浅拷贝)

var animal1 = Animal.init(name: "蛇", age: 10, gender: "安能辨你是雌雄")
var animal2 = animal1
animal2.name = "猴"
print(animal1.name)

你可能感兴趣的:(swift枚举 分支结构 函数 结构体 类)