import UIKit
class Avatar { // 角色
var name: String
var life = 100 {
didSet { // 这里一定只能用didSet,在改变之后再次改变life的值,如果用willSet只能在内部改变,出去之后还是原样
if life > 100 {
life = 100
}
}
}
var isAlive: Bool {
return life <= 0 ? false : true
}
init(name: String) {
self.name = name
}
func beAttacked(attack: Int) {
life -= attack
if life < 0 {
life = 0
}
}
}
class User: Avatar {
var score = 0
var level = 0
func getScore(score: Int) {
self.score += score
if score > level * 100 { // 升级
level += 1
}
}
}
final class Magician: User {
var magic = 100
func heal(user: User) { // 魔法师可以给User下面的所有子类治疗
user.life += 200
}
}
class Warrior: User {
var weapon: String? // 可以不拿武器
}
class Monster: Avatar {
func attack(user: User, amount: Int) {
user.beAttacked(attack: amount)
}
}
final class Zombie: Monster { // 僵尸
var type: String = "Default"
}
let player1 = Magician(name: "aaa") // 也是User的对象,也是Avatar的对象
let player2 = Warrior(name: "bbb")
let zombie = Zombie(name: "ccc")
let monster = Monster(name: "ddd")
func printBasicInfo(avatar: Avatar) {
print("名字是\(avatar.name),生命值是\(avatar.life),\(avatar.isAlive == true ? "活着" : "死了")")
}
printBasicInfo(avatar: player1)
printBasicInfo(avatar: player2)
printBasicInfo(avatar: zombie)
printBasicInfo(avatar: monster)
let avatar: [Avatar] = [player1, player2, zombie, monster] // 数组元素的类型是Avatar,可是存放的是Avatar的子类
for avatar in avatar {
avatar.beAttacked(attack: 110)
}
printBasicInfo(avatar: player1)
printBasicInfo(avatar: player2)
printBasicInfo(avatar: zombie)
printBasicInfo(avatar: monster)
player1.heal(user: player1)
player1.heal(user: player2)
print(player1.life)
printBasicInfo(avatar: player1)
printBasicInfo(avatar: player2)
2. 两段式构造
在把所有属性全部初始化之前,不允许有逻辑涉及self自身
Ps,必须先初始化子类自己的属性,再调用父类的构造函数
import UIKit
class A {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
class B: A {
var z: Int
init(x: Int, y: Int, z: Int) {
// 构造初值
self.z = z
super.init(x: x, y: y)
// 构造初值完毕,进行后续逻辑
decX()
}
func decX()
{
x -= 1
}
}
import UIKit
class A {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
convenience init(x: Int) {
let y = 6
self.init(x: x, y: y)
}
func printHello() {
print("Hello!")
}
}
class B: A { // B实现了父类的所有指定构造函数,因此B的实例可以调用A的所有指定构造函数和便利构造函数
override init(x: Int, y: Int) {
let xx = 2 * x
let yy = 2 * y
super.init(x: xx, y: yy)
}
}
let b = B(x: 10)
import UIKit
class A {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
convenience init(x: Int) {
let y = 6
self.init(x: x, y: y)
}
init() {
self.x = 100
self.y = 200
}
func printHello() {
print("Hello!")
}
}
class B: A { // B实现了父类的所有指定构造函数,因此B的实例可以调用A的所有指定构造函数和便利构造函数
override init(x: Int, y: Int) {
let xx = 2 * x
let yy = 2 * y
super.init(x: xx, y: yy)
}
}
let b = B(x: 6)
b.x
b.y
import UIKit
class A {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
convenience init(x: Int) {
let y = 6
self.init(x: x, y: y)
}
init() {
self.x = 100
self.y = 200
}
func printHello() {
print("Hello!")
}
}
class B: A {
}
let b1 = B()
let b2 = B(x: 1)
let b3 = B(x: 1, y: 2)