协议:

1.Swift协议用于定义多个类型应该遵守的规范

2.协议定义了一种规范, 不提供任何实现

3.协议统一了属性名, 方法, 下标, 但是协议并不提供任何实现

4.语法格式:

[修饰符] protocol 协议名: 父协议1, 父协议2, ... { // 协议内容 }

修饰符:可以省略, 也可以是private, internal, public之一

协议名应与类名采用相同的命名规则

一个协议可以有多个直接父协议, 但协议只能继承协议, 不能继承类

协议的内容: 指定协议实现者必须提供的那些功能, 比如属性, 方法, 构造器和下标等

实现协议的语法:

1.Struct 结构体名: 第一个协议, 第二个协议, ... { // 实现协议要求 }

2.Class 类名: SuperClass, 第一个协议, 第二个协议, ... { // 协议的要求 }

协议指定属性要求

1.协议中定义属性要求的语法格式:

class var 属性名:类型{ get set }

说明: class可有可无, 如果有class关键字, 说明为类型属性, 否则为实例属性

不可以用static代替class

get和set部分: 只需写get, set即可, 无需提供实现, set可有可无

下面是代码部分:

ViewController.swift

  1. import UIKit
  2.  
  3. class ViewController: UIViewController, ButtonViewDelegate {
  4.  
  5. // 协议规定的属性
  6. var testValueOne: String = "testValueOne"
  7. var testValueTwo: String = "testValueTwo"
  8.  
  9. var buttonView: ButtonView!
  10.  
  11. override func viewDidLoad()
  12. {
  13. super.viewDidLoad()
  14.  
  15. self.buttonView = ButtonView.buttonView()
  16. self.buttonView.frame = CGRectMake(0, 0, 200, 200)
  17. self.buttonView.center = self.view.center
  18. self.buttonView.delegate = self
  19. self.view.addSubview(self.buttonView)
  20. }
  21.  
  22. // MARK - ButtonViewDelegate
  23.  
  24. func buttonView(buttonView: ButtonView, didClickButton button: UIButton)
  25. {
  26. print("点击了ButtonView里面的按钮")
  27. }
  28. }

  

ButtonView.swift(这个类是通过xib创建的)

  1. import UIKit
  2.  
  3. protocol testDelegateOne
  4. {
  5. // 定义协议属性
  6. var testValueOne: String { get set }
  7. }
  8.  
  9. protocol testDelegateTwo
  10. {
  11. // 定义协议属性
  12. var testValueTwo: String { get set }
  13. }
  14.  
  15. // 协议可以实现多继承
  16. protocol ButtonViewDelegate: testDelegateOne, testDelegateTwo
  17. {
  18. // 协议中定义方法
  19. func buttonView(buttonView: ButtonView, didClickButton button: UIButton)
  20. }
  21.  
  22. class ButtonView: UIView
  23. {
  24. // 定义代理对象
  25. var delegate: ButtonViewDelegate?
  26.  
  27. // 快捷创建对象方法
  28. class func buttonView() -> ButtonView
  29. {
  30. let buttonView: ButtonView = NSBundle.mainBundle().loadNibNamed("ButtonView", owner: nil, options: nil).first as! ButtonView
  31. return buttonView
  32. }
  33.  
  34. @IBAction func buttonClick(sender: UIButton)
  35. {
  36. if let delegate = self.delegate {
  37. delegate.buttonView(self, didClickButton: sender)
  38. }
  39. }
  40. }

Swift中的协议的更多相关文章

  1. Swift 中的协议

    Swift 中的协议协议是为方法.属性等定义一套规范,没有具体的实现,类似于Java中的抽象接口,它只是描述了方法或属性的骨架,而不是实现.方法和属性实现还需要通过定义类,函数和枚举完成. 协议定义 ...

  2. Swift中声明协议中的class关键字的作用

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在Cocos2D编程for Swift中看到以下一个代码片 ...

  3. Swift中面向协议的编程

    什么是面向协议的编程? 面向协议的编程,是一种编程范式. 编程范式,是一个计算机科学用语.维基百科中的解释是,计算机编程的基本风格或典型模式.通俗来说,就是解决某一个问题的方法不同方法和思路. 像大家 ...

  4. 记OC迁移至swift中笔记20tips

    写久了OC后来写swift,总感觉写着是swift的皮毛,但是实际上是OC的核心,这里整理了OC迁移至swift中的一些小细节. 1 在当前类中,实例方法调用属性以及方法都可以将self省略掉,而且是 ...

  5. 思考 Swift 中的 MirrorType 协议

    Swift中的反射非常有限,仅允许以只读方式访问元数据的类型子集.或许 Swift 因有严格的类型检验而不需要反射.编译时已知各种类型,便不再需要进行进一步检查或区分.然后大量的 Cocoa API ...

  6. Swift和Objective-C中的协议(protocol)有什么异同

    Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...

  7. 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON

    项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...

  8. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型

    有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...

  9. Swift基础--通知,代理和block的使用抉择以及Swift中的代理

    什么时候用通知,什么时候用代理,什么时候用block 通知 : 两者关系层次太深,八竿子打不着的那种最适合用通知.因为层级结构深了,用代理要一层一层往下传递,代码结构就复杂了 代理 : 父子关系,监听 ...

随机推荐

  1. storm教程

    二.安装部署   一.storm伪分布式安装 (一)环境准备1.OS:debian 72.JDK 7.0 (二)安装zookeeper1.下载zookeeper并解压 wget http://mirr ...

  2. maven管理的项目出现Error configuring application listener of class org.springframework.web.context.ContextL

    eclipse里用maven管理的项目,在运行的时候出现 Error configuring application listener of class org.springframework.web ...

  3. php 编码规范(1)

    1. 包含尽量不要使用短标签例如 <? #coding ?> 2. 忽略结束标签,防止其他字符或者空格影响到代码 <?php$foo = 'foo'; 如果不开启压缩或者缓存输出时候 ...

  4. php stripslashes() addslashes() 解析

    stripslashes() 函数删除由 addslashes() 函数添加的反斜杠. 实例: <?php $str = "Is your name O\'reilly?"; ...

  5. UI、ID、UE和GUI,这些都是什么

    在网页和应用设计领域中,我们经常会听到人们用这些英文缩写描述设计工作,那么它们各自代表什么含义?具体的工作.方向和区别是什么呢? 下面让我们先来看看它们的英文全称和基本概念. UI(User Inte ...

  6. Selenium IDE测试

    判断WEB程序是否能打开页面,并且打开了正确的页面,可以通过 assertTitle和assertLocation进行判断 并且这些操作不需要提供value. target就是期望的URL和页面标题, ...

  7. ural 1333 Genie Bomber 2

    #include <cstdio> #include <cstring> #include <algorithm> #define maxn 200 using n ...

  8. Linux下配置QT环境

    一.下载Qt源码包到本机,然后解压缩 #tar zxvf qt-x11-opensource-src-4.3.2.tar.gz -C /usr/local //将qt-x11-opensource-s ...

  9. Python模块如何安装 并确认模块已经安装好?

    看自己有没有安装好,最简单的办法在可以再控制台下: C:\Users\sony>python Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC ...

  10. MyBatis里字段到枚举类型的转换/映射

    一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是枚举,在DB存储时我们想存的枚举的代号,从DB拿出来时想直接映射成目标枚举类型,也即代号字段与Java枚举类的相互类型转 ...