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

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())

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容