函数重载 和 另一种 for 循环


///重载: 函数名相同, 函数类型不同(参数/返回值不同), 构成重载, 调用的时候,
    根据参数确定调用哪个函数
func helloworld(a:Int)->Int{
    return a * 100
}
print(helloworld(5))

func helloworld(a:NSString)->Int{
    return 100
}
print(helloworld("123"))


//区间, 0...10 = [0 10]    0..<10 = [0 10)
for i  in 0..<10{
    print("i = \(i)")
}

枚举

//OC中的枚举值 是int类型, 也就是 0,1,2,3.. swift中的枚举值, 不再是int类型了, 就是枚举值
enum Direction : String{
    case East = "东"
    case west = "西"
    case south = "南"
    case North = "北"
}

var dir = Direction.East;
print(dir)
//swift中的快捷语法, 如果给一个变量赋值过一次枚举值, 下次进行赋值就直接使用 . 语法进行赋值
dir = .south
print(dir)


//枚举值的原始值
enum Season : Int {
    case Spring = 100
    case Summer
    case Autumn
    case Winter
}
var se = Season.Spring

//rawValue, 原始值
print(se.rawValue)

//通过枚举值的原始值找到枚举值
let sea = Season(rawValue: 100)
print(sea)


//隐士解析
if let s = sea {
    print("s = \(s)")
} else {
    print("无法找到枚举值")
}

类 和 结构体

//A = B

值类型 : 赋值完成以后, B修改, A 不变. 枚举值和结构体就是值类型, 类似copy 的过程

引用类型 : 赋值完成以后, B 修改, A随着B修改. 类就是引用类型, 类似 retain 的过程

结构体 值类型


struct Person{
    var height = 1.8
    var weight = 75
    var age = 25
}
//实例化结构体: ()是结构体的一个初始化方法
var p = Person()
p.weight = 90
print("他的体重是 \(p.weight) Kg")

//逐一构造器:swift 中 构造 = alloc..init ,析构 = 释放 = dealloc
var p1 = Person(height: 1.6, weight: 60, age: 18)
print("她的身高为\(p1.height), 体重为\(p1.weight), 年龄为\(p1.age)")


var p2 = p1
p1.height = 180
print("p2的.height= \(p2.height)")  //1.6

类 引用类型


class Student{
    var num = 78945
    var name = "路飞"
    var goodF = "东海"
}
//系统没有给类自动添加逐一构造器
var p = Student()
p.goodF = "北海"
print(p.goodF)

var p1 = p
p.goodF = "西海"
print("p1的.height= \(p1.goodF)")  //西海。跟struct不一样




//属性
//类名属性: static 修饰,(用类名调用)
//存储属性: 用来 存值 和 取值
//计算属性: 计算属性的值。 通过get方法, 用于获取其他元素。 set方法一般用来处理事务。
    只写get , 这个属性是只读的; 不能只写set
class Animal{

    //类名属性:是否有腿 
    static var hasLeg = true

    //存储属性
    var type = "Elephant"
    var weight = 1000

    //计算属性
    var leg  : Int{
        get{ //get 方法
            if type == "Elephant"{
                return 4
            } else if type == "人" {
                return 2
            } else {
                return 3
            }
        }
        
        //set 方法需要一个 新值  参数
        set(newValue){
            if(newValue >= 4){
                print("不是人")
            } else{
                print("有可能是人")
            }

        }
    }
}

var per = Animal()
per.type = "人"
print("人的腿的个数是\(per.leg)")

per.leg = 10
print("人的腿的个数是\(per.leg)")

print("人是否有腿: \(Animal.hasLeg)")



例子: 计算中心点(结构体)


struct Rect {

    var x = 100.0
    var y = 100.0
    var width = 100.0
    var height = 100.0

    //属性在类内部使用的时候, 可以省略self.
        只有设计到参数名字和属性相同的时候, 建议加上 self.以示区分
    var centerX :Double {
        get {
            return x + width / 2
        }
        set{
            width = (newValue - x) * 2
        }

        }
        var centerY:Double {
        get {
            return y + height / 2
        }
        set {
            height = (newValue - y)*2
        }
    }
}

var rect  = Rect()
print("centerX = \(rect.centerX)")


属性观察器


//属性观察器
class Plant{
    //类型
    var type = "绿色植物"{
        willSet(newType){
            print("新值为 = \(newType), 当前值 = \(type)")
        }didSet(oldType){
            print("旧值 = \(oldType)")
        }
    }
    //是否开花
    var hasFlower : Bool = false {
        willSet{
            print("新值为\(newValue), 当前值为\(hasFlower)")
        } didSet {
            print("旧值为\(oldValue)")
        }
    }
}

var appleTree = Plant();
appleTree.type = "苹果树"
appleTree.hasFlower = true;

方法


//结构体方法
struct Apple {
    var brand = "apple"
    var price = 14000
    func action(name:String){
        print("\(name)抽奖中了一个\(brand)的, 价值¥\(price)")
    }
}
var app = Apple()
app.action("王❀")

//方法
class Computer {
    var brand = "大船"
    var price = 6888
    func des(name:String){
        print("\(name)造了\(brand), 花了¥\(price)")
    }
}

var compu = Computer()
compu.des("路飞")


//类方法
class Car {
    static func speed(){
        print("速度是71迈")
    }
}
Car.speed()

构造方法


//除了可选类型, 在构造的过程中, 必须给各个各个属性赋初始值
class Hero{
    var age : Int?
    var name = "孙悟空"
    var equipment = "金箍棒"
    var saddleHorse :String
    
    init(){
        saddleHorse = "筋斗云"
    }
    
    //自定义一个构造器
    init(name:String, equipment:String, saddleHorse:String){
        self.name = name
        self.equipment = equipment
        self.saddleHorse = saddleHorse;
    }
}

let 孙悟空 = Hero()
print("孙悟空的坐骑是\(孙悟空.saddleHorse)")

let 大禹 = Hero(name: "大禹", equipment: 孙悟空.equipment, saddleHorse: "11路公交车")
print(大禹.name, 大禹.equipment, 大禹.saddleHorse)

便利构造器:必须调用自身的指定的构造器


//定义属性以及构造器的方法
class Film {
    var name = "大闹天空"
    var type = "myth"
    var time = "12.31"
    var price = 20
    //自定义构造器
    init(name:String, type:String, time:String, price:Int){
        self.name = name
        self.type = type
        self.time = time
        self.price = price
    }

    func description(){
        print("电影名: \(self.name), 类型: \(self.type),
            上映时间: \(self.time), 票价: \(self.price)")
    }

    //便利构造器:和 OC 的便利构造器不是一类, OC的是类方法
    //convenience: 在构造器方法前添加convenience代表当前的构造器是便利构造器
    convenience init(){
        self.init(name:"恶棍", type:"傲笑", time:"12.28", price:30)
    }
}


let film = Film(name: "挪吒脑海", type: "神话", time: "12.30", price: 11)
film.description()

let 恶棍天使 = Film()
恶棍天使.description()



继承 与 重写

//定义一个父类
class Teacher {
    var academic = "教授"
    var offer = 8888
    var num :Int{
        get{
            return 100
        } set{

        }
    }

    func teacher (){
        print("某\(academic)的薪资是\(offer)")
    }
    
    //final 方法禁止被重写
    final func study(bookName:String){
        print("某\(academic), 刻苦钻研\(bookName)")
    }
}

//定义一个子类 : 讲师
class Lecturer : Teacher{
    var industry = "iOS"
    //override, 重写父类的方法
    override func teacher() {
        super.teacher()
        print("从事行业是教授\(industry)")
    }

}

let lec = Lecturer()
lec.academic = "两院院士"
lec.offer = 10000
lec.teacher()
lec.study("论持久战")

//重写属性:把存储属性重写为计算属性,不能把计算属性改为存储属性
class ChildrenTeacher:Teacher {
    override var offer:Int{
        get{
            return 9999
        } set {

        }
    }
}
let child = ChildrenTeacher()
child.teacher()

写个小例子吧


class Perosn {
    var name :String
    var age : Int
    var gender : Bool

    init(){
        age = 18
        name = "路飞"
        gender = true
    }

    //指定构造器
    init(name:String, age:Int, gender:Bool){
        self.name = name
        self.age = age
        self.gender = gender
    }

    //便利构造器
    convenience init(name:String){
        self.init()
        self.name = name
    }

    //实例方法
    func description(){
        print("名字是\(name), 年龄是\(age), 性别是\(gender)")
    }
    
    //类方法
    static func helloWorld(){
        print("hello, World!")
    }

    //OC的便利构造器, swift版本
    //这只是一个类方法, 完成创建对象的功能,其实这不是构造器
    static func person(name:String, age:Int, gender: Bool)->(Perosn){
        
        return Perosn(name: name, age: age, gender: gender)
    }

}

//初始化
let p1 = Perosn()
let p2 = Perosn(name: "xxx")
let p3 = Perosn(name: "李阳", age: 20, gender: true)

//调用-号方法(对象方法)
p1.description()
p2.description()
p3.description()

//调用+号方法(类方法)
Perosn.helloWorld()

再一个


class Student {
    var score:Float?
    var id:Int

    init(){
        self.id = 12345
    }
}

//继承于Student
class Pupil : Student{
    var games:String
    //指定构造器:自动调用父类的 init() 方法
    init(games:String) {
        //给自身的属性赋值
        self.games = games

    }
}

let pu = Pupil(games: "LOL")
print(pu.games, pu.id)


//继承于 Pupil
class Kindergarten:Pupil{
    var fight:String

    init(fight:String) {
        self.fight = fight
        super.init(games: "CF")
    }

    //deinit, 析构, 相当于OC中的dealloc
    deinit{
        //移除观察值
        //取消代理, 地图应用
    }

}


let kind = Kindergarten(fight: "打架")
print(kind.id, kind.fight, kind.games)

//下划线是为了区分数字位数, 没有实际意义
kind.score = 59_9_1  
if let s = kind.score
print("分数是\(s)")