Swift(三)

//  类和结构体

//  Swift中对结构体进行了很多的加强,和类有很多共同点  1 都可以定义属性 也可以定义方法  2 定义构造器和OC中构造方法(init)类似  3 都可以扩展 4 都遵循协议

//  不同点 1 结构体是值类型  类是引用类型的  2 结构体不可以被继承 类可以继承  3 类可以进行类型判定 例如OC中的isKindOfClass 4 类可以通过析构器释放其占有的资源(deinit5 类是引用类型,一个类的实例可以有多个引用


//  定义一个结构体

struct Resolution{

    var width = 0.0

    var height = 0.0

    

}

//  定义一个类

class VideoMode{

    var resolution = Resolution() // 定义了一个Resolution实例

    var frameRate = 0.1 //帧率

}

//  创建一个VideoMode的实例

var videoMode = VideoMode()




//  不给属性赋初值的差别

struct ResolutionA{

    var width: Double // 不给初始值

    var height: Double

    init(width: Double, height: Double){

        // 系统默认的初始化方法, 自动创建了外部参数

        self.width = width

        self.height = height

    }

}

//  定义一个类

class VideoModeA{

    var resolution = ResolutionA(width: 1280.0, height: 720.0) // 没有初始化的值 在创建实例时 要进行初始化

    var frameRate = 0.1 //帧率

}

//  创建一个VideoMode的实例

var videoModeA = VideoModeA()

println("result:\(videoModeA.resolution.width)")

videoModeA.resolution.width = 2888.0 // 给结构体赋值

println("result:\(videoModeA.resolution.width)")


//  Swift中属性分为两种 存储属性 (直接赋值 类似变量)     计算属性 setter getter方法)

//  存储属性是在特定的类或者结构体实例的常量或者变量  可以是变量存储属性var   常量的存储属性let

//  计算属性提供setter  getter 方法 一般不直接存储值, 而是通过get取值 set是可选的来间接设置其他属性或者变量的值


struct Point{

    var x = 0.0

    var y = 0.0

}

struct Size{

    var width = 0.0

    var height = 0.0

}

struct Rect{

    var origin = Point()

    var size = Size()

    var center: Point{

    get{

        // 取值

        let centerX = origin.x + size.width/2

        let centerY = origin.y + size.height/2

        return Point(x: centerX, y: centerY)

    }

    set(newCenter){

        origin.x = newCenter.x - size.width/2

        origin.y = newCenter.y - size.height/2

    }

    }

    // 在枚举或者结构体中直接修改属性的值需要使用mutating

    mutating func changeCenter(center: Point){

        self.center = center

    }

    

}

var origin = Point(x: 0.0, y: 0.0)

var size = Size(width: 100, height:100)

var frame = Rect()

frame.origin = origin

frame.size = size

println("result:\(frame.center.x)")

frame.center = Point(x: 100,y: 100) // set改变值

println("result:\(frame.center.x)")


//  定义一个类 使用class

class Person{

    var identify = ""

    var name: String? //(可选变量)取值需要解包

    var sex: String // 属性可以不在定义的时候初始化,需要在构造函数里面初始化

    let someOne: String

    init(name: String,sex: String){

        self.name = name

        self.sex = sex

        someOne = "1"

    }

    // 定义一个实例方法

    func description() -> String{

        return "姓名 " + self.name! + " 性别 " + self.sex

    }

    // 析构器,在对象销毁的时候进行操作

    deinit{

        

    }

    // 类型方法

    class func description() -> String{

        return"这是个人"

    }

    // 类型属性, 在类中类型属性只能是计算属性 如果不写set方法 是只读的

    class var star: String{

        get{

            return "地球"

    }

    }

}

var personA = Person(name: "李四",sex: "")

var personB = Person(name: "大黄",sex: "")

println("\(personA.description())") // 实例方法

println("\(Person.description())") // 类型方法

println("\(Person.star)") // 类型属性



//  继承

class Student: Person{

    init(name: String,sex: String){

        super.init(name: name,sex: sex) // 直接调用父类放入初始化方法

        self.identify = "Student"

    }

    // 重写父类方法 override

    override func description() -> String{

        return "我是一个学生" + super.description()

    }

}

var student: Person = Student(name: "王五",sex: "")

println("\(student.description())")

//  Swift中类型判定使用is

if student is Student{

    println("这是一个学生")

}else{

    println("这不是一个学生")

}


//  协议

protocol aProtocol{

    class func typeFunc() // 类型方法

    mutating func changeValue() // 在枚举或者结构体中直接修改属性的值需要使用mutating


}

//  声明一个结构体遵守协议

struct aStruct: aProtocol{

    static func typeFunc(){  // 类型方法 static

        

    }

    mutating func changeValue(){ // 在枚举或者结构体中直接修改属性的值需要使用mutating

        

    }

}

//  声明一个类遵循协议

class aClass: aProtocol{

    class func typeFunc(){  // 类型方法 class

        

    }

    func changeValue(){ // 在枚举或者结构体中直接修改属性的值需要使用mutating

        

    }

}

//  创建实例遵循协议

var aProtocolInstance: aProtocol = aClass()

//  声明一个协议,里面有可选的方法 @optional,需要在protocol之前加objc

@objc protocol bProtocol{

    func typeFunc()

    @optional func changeValue() // 可选的 不用一定实现

    // 加了objc 不能使用mutating

}


//  如果某个类既有父类又遵循协议 (父类要在前)

class bClass: Person, bProtocol{

    func typeFunc(){

        

    }

}


猜你喜欢

转载自blog.csdn.net/a_ss_a/article/details/38519315