Swift学习笔记-面向对象

//1.Swift可以定义枚举,结构体,类,3种面向对象的类型,面向对象的两大核心是类和对象
//2.面向对象编程的3大特征,封装,继承(Swift使用协议弥补了单继承灵活性不足的缺点),多态
//3.C语言中结构体和枚举不具有面向对象的特征,Swift中多了结构体和枚举这两种程序单元


//1.枚举
//Swift的枚举不像c那么简单,是完全重新定义的类型,支持计算属性,实例方法,类型方法,支持定义构造器来完成初始化,允许通过扩展来增强原有枚举的功能,允许遵守指定协议来提供标准的功能
//1.1定义枚举,使用enum
//语法格式,枚举名首字母大写
/**
*  enum 枚举名
{
//使用case关键字列出所有的枚举值
//枚举的其他成员
}
*/
enum People
{
    //每一个case定义一个枚举实例
    case Man
    case Female
}

enum StrongPeople
{
    //一个case 定义多个枚举实例
    case Man,Female
}

/**
*  面向对象编程的五大点(牢记)
1,声明变量
2.创建实例
3,访问类型属性
4调用类型方法
5,派生子类,但是Swift只有类支持继承,枚举和结构体不支持继承
*/

//使用枚举声明变量
var manPeople :StrongPeople
//赋值
manPeople = StrongPeople.Man
//当Swift能推断出枚举类型时,允许省略枚举名前缀
//manPeople = .Man
println(manPeople)

//1.2枚举值和switch语句
var choosePeople = StrongPeople.Man
//使用switch语句判断枚举
//是个男的
switch (choosePeople)
{
case StrongPeople.Man:
    println("是个男的")
case StrongPeople.Female:
    println("是个女的")
}

//带有原始值的枚举
//需要注意的是,Swift可以通过已指定的原始的枚举来推断它前后的枚举值
/**
*  enum 枚举名 : 原始类型
{
case 枚举值 = 原始值
}
*/

//定义枚举,原始值类型为Int
enum Weekday : Int
{
    //使用一个case,swift推断Monday= 0,Thursday = 6,Friday = 7
    case Monday,Tuesday = 1,Wednesday = 5,Thursday,Friday
}

//如果指定的原始值类型不是Int,而是String,Character,Swift不能推断枚举的原始值
enum Season : Character
{
    case Spring = "S"
    case Summer = "U"
}

var day = Weekday.Monday
//获取枚举值的原始值
println("\(day.rawValue)")//0
day = .Thursday
println("\(day.rawValue)")//6

//根据原始值获取枚举值
//is U
var mySea = Season(rawValue: "S")
if mySea != nil
{
    switch mySea!
    {
    case .Spring:
        println("is U")
    case .Summer:
        println("is S")
    }
}

//rawValue是枚举值的属性,该属性用于获取枚举的原始值

//关联值,Swift不要求各枚举成员具有相同的关联值 associated value
/**
*  语法格式
case 枚举值(元组语法)
*/
//定义枚举
enum Plant
{
    //不同枚举值可以携带数量不等,类型不等的关联值
    case Mercury(weight:Double,density:Double,name:String)
    case valus(Double,Double)
    case Jupiter
    case Saturn
}

//引用类型的比较
//===,!==返回true,false

//self关键字

class Dog1
{
    //实现一个jump的方法
    func jump()
    {
        println("正在jump")
    }

    //实现一个跑的方法
    func run()
    {
        jump()
//        self.jump()
        println("正在跑")
    }
}


//局部变量隐藏存储属性
class Wolf
{
    //定义两个属性
    var name : String = ""
    var age : Int = 2
    //显示定义带参数的构造器
    init (name :String ,age : Int)
    {
        //当局不变量隐藏存储属性时
        //可用self代表调用该构造器正在初始化的实例
        //这个可以为该构造器正在初始化的实例的存储属性赋值

        self.name = name
        self.age = age
    }
    //定义一个info
    func info()
    {
        println("\(name),\(age)")
    }
}
var wolf = Wolf(name:"JiangJum", age: 24)
wolf.info()//JiangJum,24

//当self作为方法的调用者
class ReturnSelf
{
    var age : Int = 0
    func grow() -> ReturnSelf
    {
        age++
        return self
    }
}
var rt = ReturnSelf()
rt.grow()
    .grow()
    .grow()

println("\(rt.age)")//3

struct FixedLengthRange {
    var strat :Int
    let length : Int
    //由于系统会为该结构体提供初始化所有存储属性的构造器
    //因此程序可以在定义时不为实例存储属性指定初始值

}

//初始化
var rg = FixedLengthRange(strat: 2, length: 3)
println("\(rg.strat),\(rg.length)")//2.3

rg.strat = 5
//rg.length = 6//常量存储属性,无法重新赋值

struct FkRange {
    //定义两个变量存储属性
    var start : Int
    var length : Int
}

let rg1 = FkRange(start: 3, length: 4)
println("\(rg1.start),\(rg1.length)")//3,4
//rg1.strat = 4//编译错误
//由于实例被赋值给一个let声明的常量,因此FkRange就是一个不可变的,不允许修改


//lazy load 懒加载
class Dept3
{
    var id : Int
    var info : String
    init (id : Int)
    {
    self.id = id
        //暂停2秒
        NSThread.sleepForTimeInterval(2)
    self.info = "模拟读取数据"
    }
}

class User {
    var id : Int = 0
//    var dept = Dept3(id: 4)
    lazy var dept = Dept3(id: 3)
    var nicks = [String]()
}
//创建user实例
var user = User()
user.nicks.append("JiangJun")
user.nicks.append("jiangjum")
println(user.nicks)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值