Swift枚举,结构体,类,扩展,协议

2017-10-31  本文已影响179人  白石洲霍华德

1.枚举

有的变量只要几种取值的选择,在swift中对这种比较特殊的变量,可以定义为枚举类型

枚举的定义

//enum 枚举名称{
//    此处放置枚举的成员
//}

枚举的代码

enum UserLever{
    
    case 总经理
    case 业务员
}

enum UserLever1
{
    case 总经理,业务员,哈哈
}

print(UserLever1.哈哈)

//注意:枚举和Swift不同的是他们的值并不会隐式等于0,1,2,3

枚举值的遍历

let caseValue=UserLever1.哈哈

switch  caseValue{
case UserLever1.哈哈:
      print("哈哈")
case UserLever1.总经理:
      print("总经理")
default:
    print("呵呵")
}

枚举的原始值

enum sex:Int
{
    case man=1
    case female=2
    case unknow=3
}
//另一种写法
enum sex1:Int
{
    case man=1,female,unknow
}
print(sex1.man.rawValue)

//给枚举添加方法
enum sex2:Int
{
    case man,female,unknow
    func fun()
    {
        print("哈哈")
    }
}

//调用枚举中的方法
let gender=sex2.man
gender.fun()

2.结构体

结构体的定义

//struct 结构体名称{
//    此处放置结构体的内容
//}

struct People{
    
    var name="大保健"
    var sex="男"
    //给结构体添加方法
    func getName() {
        
        print("name:\(name)    sex:\(sex)")
    }
    
}

let people1=People()

people1.getName()

people1.name

3.类

Swift 类是构建代码的一种通用而灵活的构造体,类是属于用户自定义的数据类型,并且该类型的数据具有一定的行为能力,也就是类中所描述的方法

类的创建

//class 类名
//{
//    属性列表
//    方法别表
//}

class people
{
    var name = "小明"
    var sex = "男"
    
    func fun(){
        
        print("name:\(name)")
    }
}

let p=people()

p.fun()
print(p.name)

其中可以在定义类的时候,给它指定自定义的init初始化方法

class people2
{
    var name = "小明"
    var sex = "男"
    //自定义的init初始化方法
    init() {
        
        self.name="哈哈"
        self.sex="女"
    }
    //带参数的实例化
    init(name:String,sex:String) {
        
        self.name=name
        self.sex=sex
        
    }
}

let pp1=people2(name:"呵呵",sex:"女")

print(pp1.name)

类属性的set和get方法,使用get和set来间接获取/改变其他属性的值

class people3
{
    var name = "小明"
    var getpeopleName: String {
        get {
            return name
        }
        set {
            name = newValue
        }
    }
}

let pp3 = people3()
pp3.getpeopleName="呵呵呵呵呵呵"//set
pp3.name//get

类属性的willSet和didSet方法,可以给类添加属性观察者

属性观察者可以观察属性值得变化,并对此作出相应的鹅反应,当设置属性值时,属性观察者就被调用,即使当新值和原值相同时也就会被调用
可以单独或者同时使用下面的方法,以进行属性观察者的定义:willset方法在设置属性值之前被调用。而didset方法则在设置属性值之后被调用
当实现willset观察者时,新的属性值作为常量参数被传递。可以为这个参数起一个名字,如果不命名,则这个参数就被默认命名为newValue
注意:set get 方法和willSet,didSet不能一起用 好像

class people4
{
    var name = "小明"
    {
        
        willSet{
            
            print("即将设置为新值\(newValue)")
        }
        didSet{
            
           print("新值设置成功\(name)")
        }
    }
}

let pp4 = people4()
pp4.name="======哈哈"

类的静态方法

静态方法为类所有,需要通过类来使用,因此静态方法不必建立类的实例就可以使用,在Swift环境中可以为类,结构体和枚举等类型定义静态的方法,也称为类型方法

class people5
{
    //定义静态方法
    class func GetName(name:NSString)->NSString {
        
        return  name;
    }

}

print(people5.GetName(name:"哈哈哈"))

类的析构

与构造工程相反,实例最后释放的时候,需要清除一些资源,这个过程就是析构的过程。在析构过程中也会调用一个特殊的方法deinit,称之析构函数。析构函数deinit没有返回值,也没有参数,也不需要参数的小括号,所以不能重载

class people6
{
    var name:String
    
    init(name:String) {
        self.name=name
    }
    
    deinit { //定义了析构函数
        
      print("调用析构函数...")
      
        
    }
    
}


var pp6:people6? = people6(name:"小明")
print(pp6!.name)
pp6 = nil

类的继承

在Swift环境中,类的继承不同于结构体和枚举类型,继承是类所特有的。当一个类继承其他类时,继承类就被称为子类,被继承类称为父类或者超类
类的继承具有以下特点
1.继承是在一些通用类的基础上构造,建立和扩充新类的最有效的手段
2.继承能清晰体现相关类之间的程词机构关系
3.继承提供了软件复用功能
4.继承通过增强一致性,来减少模块间的接口和界面,大大增加了程序的易维护性

class people7{
    
    func say(){
        
        print("我要大保健")
    }
}


class peopleSon:people7{
    
    
    var name:String
    
    init(name:String) {
        
        self.name=name
    }
    
    
    
     func say1(){
        
        print("我们一起大保健")
    }
    
    override func say() {//重写
        
         print("我是:\(name)要去保健")
    }
    
}

let pp7=peopleSon(name:"麻痹戒指")
pp7.say()
pp7.say1()

类的延迟加载属性lazy

延迟加载属性是指当第一次被调用的时候,才会对其进行初始化的属性(就是懒加载)

class people8{

    lazy var name="小明"

}
let pp8=people8()
pp8.name

类的引用特征

class people9
{
    
    var name:String
    init(name:String) {
        
        self.name=name
    }
  
}

var pp9 = people9(name:"呵呵")
pp9.name="麻痹戒指"

var pp91=pp9
pp91.name="古天乐麻痹戒指"
print(pp91.name)

类型的检测

类型检测在swift中是一种检测实例类型的方式,同时也是让实例作为它的父类或者子类的一种方式

class people10
{
    
    var name:String
    init(name:String) {
        
        self.name=name
    }
    
}

class peopleson1:people10
{
    func say() {
        
        print("古天乐麻痹戒指")
    }
}


let pps10 = peopleson1(name:"呵呵")


// is操作符是一个类型检査操作符,在Swift中,对它的定义是:检测一个实例是不是特定类的子类型,如果是,则该操作符返回true,如果不是,则返回false.
if (pps10 is people10){
    
    print("是这种类型")
}

// as操作符是一个类型转换操作符,主要用于实例在子类和父类间的转换
if let item=pps10 as? people10{
    
    item.name="====古天乐麻痹戒指"
    item.name
}

anyObject和any

Swift为不确定类型提供了两种特殊类型别名:
AnyObject可以代表任何class类型(即类类型)的实例。
Any可以表示任何类型,包括方法类型(function types)。用来修饰任意类型的实例,包括AnyObject修饰的实例.
注意:
只有当你明确的需要它的行为和功能时才使用Any和AnyObject。在你的代码里使用你期望的明确的类型总是更好的.
AnyObject类型
AnyObject任意实例类型
Any 其实Any是AnyObject的总类,完全覆盖AnyObject.

class Evil{
    
    var name = ""
}

var hiter = Evil()
hiter.name = "保健"

var hiter1 = Evil()
hiter1.name = "大保健"

var array = [AnyObject]()
array=[hiter,hiter1]

if let item=array[1]as?Evil {
    
    item.name
}

4.扩展

Swift中的扩展功能(Extension),可以动态地给类增加功能,类似JavaScript中prototype,这包括在没有权限获取原始源代码的情况下,扩展某个类型的功能。而在object-C中,则是通过runtime中来实现动态调用或者添加功能的
现有的类,结构或枚举类型的方法,可以在扩展的帮助下进行添加。类型的功能可以使用扩展加入,但重写的功能不能使用扩展
在Swift中使用扩展可以完成以下任务
添加计算型属性和计算型静态属性
定义实例方法和类型方法
提供新的构造器
定义下标
定义和使用新的嵌套类型
使一个已有类型符合某个协议
注意:
扩展可以对一个类型添加新的功能,但是不能重写已有的功能。

示例代码

extension String{
    
    //添加属性
    var name:  String{
        
        return  "呵呵"
    }
    
    func getname(name:String) -> String {
        
        return name;
    }
}

print("名字".name)
print("名字".getname(name:"麻痹戒指"))

//添加构造器
/*
 
 其实构造器就是一个特殊的方法,所以扩展构造器方法就是添加方法,不过要注意两点:
 1:如果扩展类类型,我们只能够增加便捷构造器,而不能够增加指定构造器和析构器.
 2:对于值类型,比如结构体,枚举,在扩展其构造器时,务必保证所有的属性都被初始化.
 
 */

struct people{
    
    var name = "小明"
    
}

extension people
{
    func say() {
        
        print("麻痹戒指")
    }
}

let p = people()

p.name
p.say()

5.协议定义

协议是为方法,属性等定义一套规范,没有具体的实现,类似Java中的抽象接口,它只是描述了方法或者属性的骨架,而不是实现。
协议可以通过一个类,结构或枚举,来提供协议中要去的具体实现

示例代码

// 协议定义
//协议定义通过关键字protocol
protocol protocol1{
    
    // 协议的内容
}


// 协议可以继承一个或者多个协议

protocol protocol2:protocol1
{
    // 协议的内容
}

struct ppstruct:protocol2,protocol1
{
    // 结构体定义
}

// 类实现协议和继承父类,协议一般都写在父类后面
class Superclass {
    // 父类定义
}

class sonclass:Superclass,protocol1,protocol2
{
    //子类的定义
}

//属性要求
//协议不指定是否该属性应该是一个存储属性或者计算属性,它只指定所需的属性名称和读写类型。属性要求总是声明为变量属性,用var关键字做前缀。
protocol classprotocol{
    
    static var peoplename:String{get set}
           var peoplename1:String{get }
           var peoplename2:String{set }
    
}


// 定义类来实现协议

class Myclass:classprotocol
{
    static var peoplename="呵呵"
           var peoplename1="呵呵"
           var peoplename2="呵呵"
    
    func getName() -> String {
        
        return peoplename1
    }
}

var class1=Myclass()

print(class1.getName())

上一篇下一篇

猜你喜欢

热点阅读