IOS系列swift语言之课时五

时间:2023-03-09 08:04:40
IOS系列swift语言之课时五

过了几天没来理博客了,这次我们要讲的有:类,属性,初始化init(),初始化器,构造器等

直接刷代码了.......

 //: Playground - noun: a place where people can play

 import UIKit
//1.所有的值类型是不能继承的
//2.目前为止所有的类型(除了Class)都是值类型
// 比如String,数组,字典
//3. swift中是单继承
//4.官方文档中从来没有说所有类会继承于Object
//5.swift目前的版本是没有抽象类,也没有抽象方法
//6。重写时注意方法的名字,一定要加override
//final:就是阻止被重写
//class Parent {
// var p = 0
// func a(){
// print("parent a ")
// }
//
// //b(first:)
// func b(first a: Int) {
//
// }
////
//// //b(second:)
//// func b(second a: Int) {
////
//// }
//
// final func c() {
//
// }
//}
//
//class Child: Parent {
//
// //父类是一个存储属性,但子类重写成了一个计算属性
// //原因是:子类不知道父类的属性到底是存储还是计算属性
// // 它只知道属性的名字和类型
//// override var p: Int {
//// get {
//// return 5
//// }
//// set {
//// print("asdfasf")
//// }
////
//// }
//
// override var p: Int {
// didSet {
// print("p didset")
// }
// }
// override func a() {
// print("child a ")
// }
//
//
//
// func b(ss a: Int) {
//
// }
//}
//
//let ins: Parent = Child()
//ins.a()
//ins.p = 666
//ins.c() //**************初始化******************************
//1.初始化是确保一个类型的实例可以使用之前,其所有存储属性都得到正确的赋值
//struct FirstStruct {
// let a = 0
// let b: Int
// let c: Int
// var cp: Int {
// return 5
// }
//}
////关于结构,编译器会自动帮我们生成memberwise的初始化器
//
//let fs = FirstStruct(b: 1, c: 2) /*** 存储属性要么在声明的时候赋值要么就在init中赋值 ***/
struct FirstStruct {
let a =
let b: Int =
let c: Int
init() {
// c = 1
//在init中可以调用其它的init,但必须加上self
//第二个init只能在init中调用
self.init(c: ) }
init(c: Int) {
self.c = c
} }
//let ins = FirstStruct()
class Parent {
var name: String
var height: Int
//没有特殊的修饰符的init就是专门的(Designated init)初始化器,主要的作用就是确保 “所有的”存储属性得到初始化
//一般只有一个,可以有多个
init(name: String,height: Int ) {
self.name = name
self.height = height
} //便利初始化器是方便创建对象使用,它必须直接或间接调用专门初始化器
convenience init(name: String) {
self.init(name: name, height: )
}
convenience init() {
self.init(name: "weimingming")
}
}
let p = Parent()
p.name
p.height
//构造器编写的基本套路
//1.一般是只写一个专门的初始化器,用来实例化所有的存储属性
//2.可以添加任意多个便利初始化器,来直接或间接调用专门的初始化器
//3.子类也一般只创建一个专门的初始化器,用来初始化
//本类的所有存储属性
//4.子类的专门初始化器,必须调用父类的专门初始化器
//5.子类的便利初始化器,必须调用(委派,delegate)自己的专门初始化器 class Child: Parent {
var age: Int
init(age: Int){
self.age = age
super.init(name: "hexin", height: )
self.name = "xxxx"
} //子类的便利初始化器,必须委派(delegate)到自己的专门初始化器
convenience init() {
//self.init(age: 18) self.init(age: )
}
}
//
let c = Child()
c.name
c.age
c.height
//小结:1.自己的便利一定要调用自己的专门的初始化器
//2.自己的专门初始化一定要调用父类的专门 /*********** Failable init**/
class Test {
var name = ""
init?(name: String) {
if name.isEmpty {
return nil
}
self.name = name
}
} class Test2: Test {
override init(name: String) { super.init(name: name)!
}
}
let t = Test(name: " ")
if t == nil {
print("nil.......")
} //enum Gender {
// case male,female
// init?(xingbie: String) {
// switch xingbie {
// case "f":
// self = .female
// case "m":
// self = .male
// default:
// return nil
// }
// }
//}
//
//let g = Gender.male
//let g2 = Gender(xingbie: "xxx")
//if g2 == nil {
// print("xxx 不能转换为一个枚举值")
//} enum Gender: String {
case Male = "M",Female
} let g3 = Gender(rawValue: "M")
if g3 == nil {
print("xxx 不是枚举值")
}
/* Required init *****/
class Test3 {
var name = ""
//required表明此初始化器,子类必须重写(但不需要有override)子类也必须加上requried,表明子类的子类也需要重写
required init(name: String) {
self.name = name
print("test3 init...")
}
} class Test4: Test3 {
let age : Int
init(age: Int) {
self.age = age
super.init(name: "asfd")
} required init(name: String) {
self.age =
print("test3 init...")
super.init(name: name)
}
} let t4 = Test4(age: ) class LaJi {
var name = "aaa"
deinit{
print("清理工作")
}
}
//var lji: LaJi? = LaJi()
//lji = nil func xx() {
let lll = LaJi()
lll.name = "bbbb" }
xx()