Swift编程基础(三)

课程来源于:Swift编程基础

21. 枚举相关值, 遍历枚举

21.1 枚举相关值

enum TestEnum{
    case name(String)
    
    case age(Int)
    
    case xy(Int, Int)
}
func play(param:TestEnum){
    switch param {
        case TestEnum.name("hello"):
            print("hello")
        case TestEnum.age(10):
            print(10)
        case TestEnum.xy(100, 200):
            print(100, 200)
    default:
        print("没有匹配")
    }
}

play(param: TestEnum.name("hello"))
play(param: TestEnum.age(101))
play(param: TestEnum.xy(101, 200))
hello
没有匹配
没有匹配

21.2 遍历枚举

enum TestEnum:CaseIterable{
    case A
    case B
    case C
}

print(type(of: TestEnum.allCases))

for item in TestEnum.allCases {
    print(item)
}

print()

for index in (0 ..< TestEnum.allCases.count) {
    print(TestEnum.allCases[index])
}
Array<TestEnum>
A
B
C

A
B
C

22. 结构体定义使用

结构体相似, 但是还是有区别的

struct Student{
    var name = "unkown"
    var age = 0
    var score = 0.0
    var isPass = false
    static let school = "家里蹲大学"
    
    init(name:String, age:Int, score:Double) {
        self.name = name
        self.age = age
        self.score = score
        if(self.score < 60){
            self.isPass = false
        }else{
            self.isPass = true
        }
    }
    
    func getName() -> String {
        return self.name
    }
    
    func getAge() -> Int {
        return self.age
    }
    
    func getScore() -> Double {
        return self.score
    }
    
    func getIsPass() -> Bool {
        return self.isPass
    }
    
    //结构体中函数修改需要加上 mutating
    mutating func setScore(score:Double){
        self.score = score
        if(self.score < 60){
            self.isPass = false
        }else{
            self.isPass = true
        }
    }
}

var a = Student(name:"小A", age:18, score:47.8)
print("姓名: " + a.getName())
print("年龄: " + String(a.getAge()))
print("分数: " + String(a.getScore()))
print("是否通过考试: " + String(a.getIsPass()))
print("学校: " + Student.school)
print()
a.setScore(score: 61)
print("分数: " + String(a.getScore()))
print("是否通过考试: " + String(a.getIsPass()))
姓名: 小A
年龄: 18
分数: 47.8
是否通过考试: false
学校: 家里蹲大学

分数: 61.0
是否通过考试: true

静态属性不能通过实例来修改

struct School{
    static var schoolName = "家里蹲大学"
}

//var a = School()
//不能通过实例修改
//a.schoolName = "哈佛"
//print(a.schoolName)

School.schoolName = "清华"
print(School.schoolName)
清华

结构体是传递

struct Test{
    var t1 = 10
}

var a = Test()
print(a.t1)

var b = a
print(b.t1)

b.t1 = 100
print(b.t1)

print(a.t1)
10
10
100
10

23. 计算属性的使用

23.1 计算属性set和get

struct  Person {
    private var value = ""
    
    var name:String{
        set{
            value = newValue + "- hello world -"
            
            print("set - " + newValue)
        }
        
        get{
            print("get")
            return value + " - ios"
        }
    }
    
    init() {
        
    }
}

var person = Person()

person.name = "hahaha"


person.name
print(person.name)
set - hahaha
get
get
hahaha- hello world - - ios

23.2 只读属性

struct Person{
    private var value = "hello world"
    
    var name:String{
        get{
            return value
        }
    }
    
    init() {
        
    }
}
var person = Person()
print(person.name)
hello world

23.3 小应用

struct Person{
    private var value = "hello world"
    
    private var name:String{
        set{
            value = newValue
        }
        get{
            return value
        }
    }
    
    init(name:String) {
        self.name = name
    }
    
    func getName() -> String{
        return self.name
    }
    
}


var person = Person(name:"swift")
//private 属性后不能调用 get
//person.name

print(person.getName())
swift

24. 属性观察的使用willSet和didSet

属性观察就相当于属性监听

struct Person{
    var name:String{
        willSet{
            print("willSet:" + newValue)
        }
        didSet{
            print("didSet:" + oldValue)
        }
        
    }
    
    init(name:String) {
        self.name = name
    }
}

var person = Person(name:"hello")

person.name = "swift"

print(person.name)

person.name = "world"
willSet:swift
didSet:hello
swift
willSet:world
didSet:swift

25. 下标语法subscript

struct Person{
    private var array:[String] = ["swift", "ios", "macos"]
    
    subscript(index:Int) -> String{
        set(new_value){
            print("set \(index) - " + new_value)
        }
        get{
            print("get")
            return "apple"
        }
    }
}

var person = Person()

person[100] = "hello"

print(person[100])
set 100 - hello
get
apple
struct Person{
    private var array:[String] = ["swift", "ios", "macos"]
    
    subscript(index:Int, param:String) -> String{
        set(new_value){
            array.insert(new_value + param, at: index)
        }
        get{
            return array[index]
        }
    }
}

var person = Person()

person[0, "A"] = "hello"

print(person[0, ""])
print(person)
helloA
Person(array: ["helloA", "swift", "ios", "macos"])

26. 类的定义使用, 类的实例是传引用

结构体是传

26.1 类的定义使用

class Student{
    private var name:String = ""
    private var age:Int = -1
    private var score:Double = -1
    private var isPass:Bool = false
    public static let schoolName = "哈佛学院"
    
    //调用另一个init, 需要加 convenience
    convenience init() {
        self.init(name:"unknown", age:0, score:0.0)
    }
    
    init(name:String, age:Int, score:Double) {
        self.name = name
        self.age = age
        self.score = score
        isPass(score: score)
    }
    
    private func isPass(score:Double){
        self.score = score
        if(score < 60){
            self.isPass = false
        }else{
            self.isPass = true
        }
    }
    
    public func getName() -> String{
        return self.name
    }
    
    public func getAge() -> Int{
        return self.age
    }
    
    public func getscore() -> Double{
        return self.score
    }
    
    public func getIsPass() -> Bool{
        return self.isPass
    }
    
    public func setscore(score:Double){
        
        isPass(score: score)
    }
}


var s1 = Student()
print(s1.getName())
print(s1.getAge())
print(s1.getscore())

print()

var s2 = Student(name:"小A", age:18, score: 68)
print("姓名: " + s2.getName())
print("年龄: " + String(s2.getAge()))
print("得分: " + String(s2.getscore()))
print("是否通过: " + String(s2.getIsPass()))

print()

s2.setscore(score: 55)
print("得分: " + String(s2.getscore()))
print("是否通过: " + String(s2.getIsPass()))
unknown
0
0.0

姓名: 小A
年龄: 18
得分: 68.0
是否通过: true

得分: 55.0
是否通过: false

结构体不同的地方

class Student{
   var name = "hello"
    
}

//let s1是可以修改的
//结构体这样是不可以修改的
let s1 = Student()

s1.name = "world"
print(s1.name)
world

27. 类中使用属性计算, 属性观察, 下标语法

结构体的基本一致

28.Any 和 AnyObject类型

  • Any是表示任意一种类型(包括 ).
  • AnyObject是只能表示类型.

29.类的继承

class Person{
    
}

class Student: Person{
    
}

30. 向下类型转换

为了解决AnyAnyObject继承不到父类的方法

class Person{
    private var name:String
    
    private var age:Int
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
    
    public func setName(name:String){
        self.name = name
    }
    
    public func setAge(age:Int){
        self.age = age
    }
    
    public func getName() -> String{
        return self.name
    }
    
    public func getAge() -> Int {
        return self.age
    }
}

class Student : Person{
    
}


//解决Any 过大需要向下类型转换
//var s1:Any = Student(name:"xiaoA", age: 18)
//print(s1.getName())
//print(s1.getAge())
//print(type(of: s1))


var s2:Any = Student(name:"xiaoA", age: 18)

//改写1(确定Student是继承的)
let s = s2 as! Student
print(s.getName())
print(s.getAge())
print(type(of: s))

print()

//改写2(不确定Student是继承的)
if let s = s2 as? Student{
    print(s.getName())
    print(s.getAge())
    print(type(of: s))
}
xiaoA
18
Student

xiaoA
18
Student
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值