Swift中的协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift中的协议相关的知识,希望对你有一定的参考价值。

协议:

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

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

 

下面是代码部分:

ViewController.swift

import UIKit

class ViewController: UIViewController, ButtonViewDelegate {
    
    // 协议规定的属性
    var testValueOne: String = "testValueOne"
    var testValueTwo: String = "testValueTwo"
    
    var buttonView: ButtonView!

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        self.buttonView = ButtonView.buttonView()
        self.buttonView.frame = CGRectMake(0, 0, 200, 200)
        self.buttonView.center = self.view.center
        self.buttonView.delegate = self
        self.view.addSubview(self.buttonView)
    }
    
    // MARK - ButtonViewDelegate
    
    func buttonView(buttonView: ButtonView, didClickButton button: UIButton)
    {
        print("点击了ButtonView里面的按钮")
    }
}

  

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

import UIKit

protocol testDelegateOne
{
    // 定义协议属性
    var testValueOne: String { get set }
}

protocol testDelegateTwo
{
    // 定义协议属性
    var testValueTwo: String { get set }
}

// 协议可以实现多继承
protocol ButtonViewDelegate: testDelegateOne, testDelegateTwo
{
    // 协议中定义方法
    func buttonView(buttonView: ButtonView, didClickButton button: UIButton)
}

class ButtonView: UIView
{
    // 定义代理对象
    var delegate: ButtonViewDelegate?
    
    // 快捷创建对象方法
    class func buttonView() -> ButtonView
    {
        let buttonView: ButtonView = NSBundle.mainBundle().loadNibNamed("ButtonView", owner: nil, options: nil).first as! ButtonView
        return buttonView
    }
    
    @IBAction func buttonClick(sender: UIButton)
    {
        if let delegate = self.delegate {
            delegate.buttonView(self, didClickButton: sender)
        }
    }
}

以上是关于Swift中的协议的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 中的 Android 片段模拟

swift 代码片段

我如何知道如何遵守 Swift 中的特定协议?

如何将这个 Objective-C 代码片段写入 Swift?

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

Swift 协议扩展中的“关联类型”难以理解