课程来源于: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. 向下类型转换
为了解决Any
和AnyObject
继承不到父类的方法
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