Swift2.0(16)分类与协议

  • 扩展(分类)

类似于Objective-C中的分类功能

即:在现有的一个类型(类类型、结构体、枚举)的基础上添加功能(方法)

这个现有的类,可以是自定义的,也可以是其他框架中的(甚至没有源代码的)

提供了一定的“逆向开发”的能力

格式:

extension 现有类型 {

//添加的功能

}

可添加的功能:

a. 添加行为属性、类行为属性(静态行为属性)、静态存储属性

b. 添加各种方法:实例方法、类方法(静态方法)、便捷构造方法、下标方法等

c. 添加新的嵌套类型

d. 添加需要遵循的协议

其中:类属性、类方法是类类型的,二静态

不能添加的功能:

a. 对象的存储属性(类存储属性(静态属性)可以)

b. 不能重写方法,但可以重载

c. 不能添加重名行为属性

意义:

逆向开发

复杂类型分模块开发

...

如结构体:

extension Double {
        static var pi1 = 3.14  //静态存储属性
        var pi2:Double { //行为方法
            return 3.14
        }
        static var pi3:Double { //静态行为属性
            return 3.14
        }
        func print1() { //实例方法
            print(self.pi2)
        }
        static func print2() { //静态方法
            print(self.pi3)
        }
    }
    var d1:Double = Double()
    print(Double.pi1)
    print(d1.pi2)
    print(Double.pi3)
    d1.print1()

Double.print2()

如类类型:

class A {
        var names:[AnyObject] = [AnyObject]()
    }
    extension A {
        static var pi1 = 3.14 //静态存储属性
        var pi2:Double { //行为方法
            return 3.14
        }
        class var pi3:Double { //类行为属性
            return 3.14
        }
        func print1() { //实例方法
            print(self.pi2)
        }
        class func print2() { //类方法
            print(self.pi3)
        }
        //便捷构造方法
        convenience init(value:AnyObject, number:Int) {
            self.init()
            for var i=0; i<number; i++ {
                self.names.append(value)
            }
        }
        //下标脚本方法
        subscript(index:Int)->AnyObject {
            get {
                return self.names[index]
            }
            set {
                self.names[index] = newValue
            }
        }
    }
    var a1:A = A(value: "hello", number: 5)
    for var i=0;i<5;i++ {
        print(a1[i])
    }
    print(A.pi1)
    print(a1.pi2)
    print(A.pi3)
    a1.print1()

A.print2()

  • 协议

协议规定了用来实现某些特定功能所需要的方法及属性

类类型、结构体、枚举都可以遵循协议,即获得协议中规定接口并实现这些接口

即:面向接口编程

协议定义格式:

protocol 协议名称 { 协议体 }

protocol 协议名称:协议1, 协议2  { 协议体 }

协议还可以继承其他协议,且可以使多继承的

类类型特定协议格式:

@objc protocol 协议名称 { 协议体 }

protocol 协议名称: class { 协议体 }

遵循协议的类型在实现的属性和方法前前需要 @objc 修饰

类型遵循协议:

class 类名 : 协议名1, 协议名2 { }

struct/enum 名字: 协议名1, 协议名2 { }

类型可以遵循多个协议(只能有一个父类)

协议中的方法:

协议中添加一系列相关方法的接口,并在遵循类型中给出实现

可以是对象方法,也可以是类方法(用static修饰)

在@objc修饰的协议中,可以使用optional修饰方法/属性

在遵循类型中可以选择是否给出实现,否则必须实现

如:

@objc protocol AProtocol {
        func sayHello()->String
        static func sayHello()->String

}

class A : AProtocol {
        @objc func sayHello()->String {
            return "hello"
        }
        @objc class func sayHello()->String {
            return "HELLO"
        }

}

协议中的属性:

只能用var描述属性,遵循协议的类型实现属性时不能修改类型及标示符

协议中声明的属性不能赋初值

可以是 实例属性 也可以是 类属性(用static修饰)

属性后{get} 表示 该属性在实现时可以是var也可以是let

属性后{get set } 表示 该属性在显示时只能是var不能是let

如:

protocol CarProtocol {
        var brandName:String { get set }    //品牌
        var modelName:String { get set }    //车型

var price:Double { get set }        //价格

}

protocol HouseProtocol {
        var houseName:String { get set }    //小区名
        var houseSize:Double { get set }    //平米大小
        var houseUnitPrice:Double { get set } //楼房单价

}

protocol MarryProtocol: CarProtocol, HouseProtocol {
        static var isMarrayed:Bool { get set }
        var marrayYear:Int { get }

}

class Person:MarryProtocol {
        //CarProtocol
        var brandName:String = ""
        var modelName:String = ""

var price:Double = 0.0

//HouseProtocol
        var houseName:String = ""
        var houseSize:Double = 0.0

var houseUnitPrice:Double = 0.0

//MarrayProtocol
        static var isMarrayed:Bool = false
        var marrayYear:Int {
            get {
                return 1
            }
        }

}

协议中声明构造方法

在协议中可以声明构造方法(包括便捷构造、可失败构造)

遵循协议的类,在实现构造方法时,需要使用 required 关键字修饰

其意义:该类的子类,需要重写这个协议声明的构造方法

遵循协议的类,使用final修饰时,可以不适用required修饰构造方法

协议作为类型

protocol<协议1,协议2,...>

如:

protocol AProtocol {
        static var name:String { get set }
    }
    protocol BProtocol {
        var age:Int { get set }
    }
    struct AStruct : AProtocol, BProtocol {
        static var name:String = "AAA"
        var age:Int = 111
    }
    struct BStruct : AProtocol, BProtocol {
        static var name:String = "BBB"
        var age:Int = 222
    }
    var p1:protocol<AProtocol, BProtocol> = AStruct()

var p2:protocol<AProtocol, BProtocol> = BStruct()

协议的应用场合:

一定程度上实现了多继承的功能

常见的设计模式中,如代理设计模式

现有类实现扩展时,可以子扩展中遵循协议

时间: 2024-10-10 07:30:35

Swift2.0(16)分类与协议的相关文章

Swift2.0初见笔记

Swift2.0 1.简单值 1.使用let来声明常量,常量无法改变(相当于const);使用var来声明变量. var myVariable = 42 myVariable = 50 let myConstant = 42 2.常量或者变量的类型必须和你赋给它们的值一样.然而,你不用明确地声明类型,声明的同时赋值的话,编译器会自动推断类型 let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Double

关东升的《Swift2.0》(暂定名)即将出版

大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我将在11月左右出版,<Swift2.0>(暂定名) ,<Swift2.0>将在<Swift开发指南>第1版的基础上添加Swift2.0的内容,同时摒弃第1版的一些不合理的内容,使得本书更加适合Swift开发者.我将连续发一些Swift2.0的学习笔记,有兴趣者,可以看一下. 附<Swift2.0>(暂定名)此书目录: 1 本书约定 2 第一个Swift

OC分类和协议

// //  ViewController.m //  OC11分类和协议 // //  Created by Zoujie on 15/9/13. //  Copyright (c) 2015年 Zoujie. All rights reserved. // #import "ViewController.h" #import "Fraction.h" #import "GraphicObject.h" @interface ViewContr

OC的分类和协议

分类和协议是OC中比较显著的俩个特点.分类的功能主要是实现类的扩展,协议则常常用在代理的实现上. 1.分类的声明 在分类的接口文件中,只允许新增方法,不能新增变量.语法形式: @interface 类名 (分类名) 新增的方法声明: @end 2.定义方法 在分类的实现文件中,对新增方法进行定义,语法如下: @implementation 类名 (分类名) 新增的方法的定义{ 语句: } @end 3.方法调用 分类的方法声明和定义之后,就可以进行调用了,语法如下: [对象名 新增方法名] 实例

Swift基础知识入门(基于Swift2.0)

//: Playground - noun: a place where people can play import UIKit // Swift中不需要设置main函数入口,编译器会在全局函数中自动设置程序的入口,在书写Swift代码时,可以不使用";"作为语句的结束标志 var str = "Hello, playground" var str1 = "Hello, LiLe" print("Hello World!")

Swift2.0(6)结构体类型&枚举类型

结构体类型 基础数据类型都是结构体,如Int  Float Bool等,是Swift自带的并且作为开发基础供开发者使用 在Swift中,结构体(Struct)和类类型(Class)非常相似,结构体是值类型,类是引用类型. 定义格式: struct 名称 : 协议... { 属性和方法 } 如: struct Sword { var length:Int = 11 var name:String = "hello world" func description() { print(&qu

swift2.0语言新特性

更多文章关注小编的博客www.goofyy.com/bolg/ 传送门: goofyy技术宅 swift语言是苹果公司在2014年WWDC开发者大会上推出的新的开发语言,时至一年,swift经历了几番变更,在2015年的新过去的开发者的会上,苹果推出swift正式版2.0.并在2015年年底开放源代码,不得不说,这是一件很碉碉的事,其实swift开源的意义对于开发者来讲,主要是可以在更多地平台上面使用swift开发语言开发应用,不得不说,苹果公司也是放了一个大招. 小编也斗胆把自己当做swift

Swift2.0语言教程之函数嵌套调用形式

Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还可以调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其他函数:另一种是在一个函数中调用自身函数.以下将对这两种调用进行详细讲解. Swift2.0语言嵌套调用基本形式 嵌套调用是指在函数中可以调用其他函数.调用方式如图7.4所示.   图7.4  函数嵌套的形式 [示例7-25]以下将使用函数的嵌套调用实现对s = 22! + 32!的计算.代码如下: impo

总结swi1.2适配swift2.0遇到的改变

swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sorted变成了sort 4.enumerate(self.tableView.visibleCells)修改为self.tableView.visibleCells.enumerate() 5.Printable 变成了CustomStringConvertible 6.DebugPrintable

centos7编译安装LNMP(nginx-1.16.0,mysql8.0.16,php-7.3.6)常见问题报错及解决方法

LNMP的安装与配置 nginx-1.16.0安装及配置: 第一步:前往官网下载nignx源码包 下载完毕后上传至服务器(先安装lrzsz) yum -y install lrzsz 安装完毕后执行: rz 找到nginx包后点击确定,即可上传成功 第二步: 解压: tar zxvf nginx-1.16.0.tar.gz 进入: cd nginx-1.16.0/ 创建用户.用户组: groupadd nginx useradd -g nginx nginx -s /sbin/nologin 第