extension基本功能

Swift扩展是为结构体、类和枚举增加新功能。与OC的分类相似,但是没有扩展名字。

常用于:

  • 添加类/实例计算属性
  • 添加类/实例方法
  • 提供新便携初始化器
  • 定义和使用新内嵌类型
  • 使现有类型遵循某些协议
  • 定义下标

更多的使用extension 可以使您的文件层次化,文件结构更清晰,更加具有面向协议编程效果,后期优化的时候能更方便。

为协议提供默认实现

Swift  定义协议默认都是必须实现,那如果想让某些方法或者属性可选实现怎么办了, 1.使用协议扩展来默认实现,2.使用optional关键字,作为Swift Style 建议选择扩展协议来达到可选功能,而且不需要使用可选链哟。

示例

// 遵守
extension ViewController: SomeOptionProtocol {func methodB() {}func methodC() {}
}
protocol SomeOptionProtocol {func methodA();func methodB();func methodC();   //可选方法
}
extension SomeOptionProtocol {func methodC() {print("提供默认实现")}
}

使用optional实现协议可选(不建议)

extension ViewController: SomeOptionProtocol {func methodA() {}func methodB() {}}@objc protocol SomeOptionProtocol {func methodA();   func methodB();@objc optional func methodC(); // 可选方法
}

给协议添加限制

示例

extension Collection where Iterator.Element: TextRepresentable {var textualDescription: String {let itemsAsText = self.map { $0.textualDescription }return "[" + itemsAsText.joined(separator: ", ") + "]"}
}

区分内部结构层次

当一个Swift文件(比如ViewController)遵守多个不同协议的时候,如果使用扩展遵守协议,能很好的区分文件结构。

如下图

系统类型扩展

通过扩展系统类型达到增加功能和管理作用。

Notification.Name统一管理

传统监听通知或者发送通知,通知名字常常通过字符串初始化,容易引起输入错误,和(监听和发送)增删不同步的问题。可以借助扩展进行通知定义和管理。方便调用。

通知名扩展定义

extension Notification.Name {static let valueChanged = Notification.Name(rawValue: "valueChanged")  // 值改变通知static let newValue = Notification.Name(rawValue: "newValue")          // 新值通知
}

添加通知监听

private func addNoti() {NotificationCenter.default.addObserver(self, selector: #selector(valueChanged(noti:)), name: .valueChanged, object: nil) // 直接使用点语法// 原始用法,  1.可能存在字符串拼错问题 2.如果注册或者监听通知之一移除,另一个可能不会及时移除。//NotificationCenter.default.addObserver(self, selector: #selector(valueChanged(noti:)), name: NSNotification.Name("valueChanged"), object: nil)  }

更优雅的使用Selector

定义Action方法

// MARK: - Action
extension ViewController {@objc fileprivate func button1Tapped(sender: UIButton) {print("点击按钮1")}@objc fileprivate func button2Tapped(sender: UIButton) {print("点击按钮1")}@objc fileprivate func button3Tapped(sender: UIButton) {print("点击按钮1")}@objc fileprivate func button4Tapped(sender: UIButton) {print("点击按钮1")}
}

扩展Selector

// MARK: - Selector
fileprivate extension Selector {   // 为了只在文件内访问,添加fileprivatestatic let button1Tapped = #selector(ViewController.button1Tapped(sender:))  // 通过静态变量添加static let button2Tapped = #selector(ViewController.button1Tapped(sender:))static let button3Tapped = #selector(ViewController.button1Tapped(sender:))static let button4Tapped = #selector(ViewController.button1Tapped(sender:))}

直接通过.语法调用

/// 设置按钮private func setupButtons() {let button1 = UIButton(type: .custom)button1.addTarget(self, action: .button1Tapped, for: .touchUpInside)   // 点语法调用//button1.addTarget(self, action: #selector(button1Tapped(sender:)), for: .touchUpInside)  // 原始语法//依次为buttons添加target}

警告:该Selector扩展适合文件内有多个Selector方法时使用,毕竟需要增加多余定义代码, 建议添加权限控制,

Swift extension 扩展实用Tips相关推荐

  1. swift 字符串转int_Swift Tips Streamline 如何假装写过 Swift

    作者 Nemocdz,腾讯 iOS 工程师.这篇文章转载至他的博客,可以点击阅读原文来查看他的博客.本文总结了笔者日常使用 Swift 的一些小 Tips. 文章较长,预计阅读时间 15分钟 Safe ...

  2. 【Android Gradle 插件】Extension 扩展类型 ( Module 引入插件类型 | application 插件 | library 插件 | Variants 变体列表 )

    文章目录 一.Module 引入插件类型 1.com.android.application 插件 2.com.android.library 插件 二.Extension 扩展类型 三.applic ...

  3. Unity Cinemachine智能相机教程(五):VirtualCamera的Extension扩展

    摘要:[长文预警,先收藏后品尝]如何让相机更智能呢?Extension扩展可以给虚拟相机带来无限的可能. 洪流学堂,让你快人几步.你好,我是跟着大智(VX: zhz11235)学Unity的萌新,我叫 ...

  4. Safari Extension 扩展插件中关于权限的二三事(例如设置权限、权限类型等)

    Safari Extension 扩展插件的权限相关的内容大致分为下面几个方面: 用户要掌控扩展(Users are in control) Safari Extension 扩展插件是要在用户控制下 ...

  5. Category(分类/类目)、Protocol(协议)、Extension(扩展/延展)

    Category(分类/类目): 利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可 ...

  6. PostgreSQL编写记录删除表格信息的Extension扩展

    摘要:因为作者水平有限,暂且只是测试Extension扩展用例, 一个典型的extension包含多个SQL对象.举个例子,如果我们创建一个新的数据类型(data type),那可能同时还需要与之相关 ...

  7. swift为UIView添加extension扩展frame

    添加swift file:UIView+Extension import UIKitextension UIView {// x var x : CGFloat {get {return frame. ...

  8. swift_027(Swift 的扩展)

    //***********swift学习之27--扩展--*************************** /* 扩展跟OC一样就是向一个已有的类.结构体或枚举类型添加新功能. 只能添加新的功能 ...

  9. Swift类扩展使用方法

    2019独角兽企业重金招聘Python工程师标准>>> Swift是没有OC中的分类的. 但可以进行类扩展, 一般用于实现代理方法. 类扩展中无法定义属性 使用方法: extensi ...

最新文章

  1. PHP如何通过Http Post请求发送Json对象数据?
  2. 嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)
  3. html不支持ie7,解决IE6/IE7/IE8不支持before,after问题
  4. autojs 云控_autojs websocket 核心示例代码,云控技术
  5. @RequiresPermissionss是否可以填写多种权限标识,只要满足其一就可以访问?
  6. hashmap是有序还是无序_说实话,你要是看完这篇 HashMap ,和面试官扯皮真的就没问题了!
  7. Java泛型(类、接口、方法)及通配符
  8. python是什么意思-python是什么意思
  9. [转载] python定义整型常量_Python笔记——数据类型、变量和常量
  10. MacOS实现MSDOS格式化为NTFS文件系统
  11. 41. 流感传染(宽搜)
  12. cad剖切线的快捷键_CAD快捷键记不住怎么办?顶级绘图员教你,从此不求人
  13. 最新遇到的产品经理面试题
  14. MySQL数据库之分库分表方案
  15. LOTO课6:一只三极管的输出特性曲线的测绘
  16. 嵌入式系统开发-麦子学院(11)——ARM Cortex A8 硬件基础(1)
  17. 【软件工程】决策表和决策树
  18. Leetcode之Non-decreasing Array 问题
  19. 搭配Online:瑞幸昔日“盟友”神州优车,与北汽集团达成战略合作
  20. Graccvs文件正文提取开发组件--文件内容搜索的利器

热门文章

  1. 实战 PK!RTX2080Ti 对比 GTX1080Ti 的 CIFAR100 混合精度训练
  2. 使用 WebIDE 三分钟上手函数计算
  3. Ubuntu14.04重启网卡不生效
  4. SEO中的DIV CSS样式的命名规则
  5. Delphi 的消息机制浅探三
  6. [转]计算机存储 cache介绍
  7. 优化一个小时不出结果的SQL
  8. footer始终在页面最底部的方法(问题待检验)
  9. 第二周作业-停车场门禁控制系统的状态机
  10. Android图片轮播