網站首頁 編程語言 正文
擴展(Extension)
1、Swift中的擴展,有點類似于OC中的分類(Category)
2、擴展可以為枚舉、結構體、類、協議添加新功能
可以添加方法、計算屬性、下標、(便捷)初始化器、嵌套類型、協議等等
3、擴展不能辦到的事情
不能覆蓋原有的功能
不能添加存儲屬性,不能向已有的屬性添加屬性觀察器
不能添加父類
不能添加指定初始化器,不能添加反初始化器
。。。。
extension Double {
var km: Double {
self * 1_000.0
}
var m: Double {
self
}
var dm: Double {
self / 100.0
}
var cm: Double {
self / 10.0
}
var mm: Double {
self / 1_000.0
}
}
var d = 100.0
d.km
d.m
d.dm
var arr: Array<Int> = [10, 20, 30]
extension Array {
subscript(nullable idx: Int) -> Element? {
if (startIndex ..< endIndex).contains(idx) {
return self[idx]
}
return nil
}
}
print(arr[nullable: 1] ?? 0)
extension Int {
func repeats(task: () -> Void) {
for _ in 0..<self {
task()
}
}
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0: return .zero
case let x where x > 0: return.positive
default: return .negative
}
}
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
協議與初始化器
class Person {
var age: Int
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
}
extension Person: Equatable {
static func == (left: Person, right: Person) -> Bool {
left.age == right.age && left.name == right.name
}
convenience init() {
self.init(age: 0, name: "")
}
}
1、如果希望自定義初始化器的同時,編譯器也能夠生成默認初始化器,那么可以在擴展中編寫自定義初始化器
struct Point {
var x: Int = 0
var y: Int = 0
}
extension Point {
init(_ point: Point) {
self.init(x: point.x, y: point.y)
}
}
2、required初始化器不能寫在擴展中
協議
1、如果一個類型已經實現了協議的所有要求,但是還沒有聲明它遵守了這個協議
可以通過擴展來讓它遵守這個協議
2、給協議進行擴展后,凡是遵守了這個協議的都會有對應的擴展方法,以下面為例,編寫一個函數,判斷一個證書是否為奇數。
extension BinaryInteger {
func isOdd() -> Bool {
self % 2 != 0
}
}
3、擴展可以給協議提供默認實現,也間接實現 可選協議 的效果
protocol TestProtocol {
func test1()
}
extension TestProtocol {
func test1() {
print("TestProtocol test1")
}
func test2() {
print("TestProtocol test2")
}
}
class TestClass: TestProtocol {
func test1() {
print("TestClass test1")
}
func test2() {
print("TestClass test2")
}
}
var cls: TestProtocol = TestClass()
cls.test1() //TestClass test1
cls.test2() //TestProtocol test2
泛型
1、擴展中依然可以使用原類型中的泛型類型
2、符合條件才擴展
extension Stack: Equatable where E: Equatable {
}
原文鏈接:https://blog.csdn.net/run_in_road/article/details/126653401
相關推薦
- 2022-10-20 三種Golang數組拷貝方式及性能分析詳解_Golang
- 2023-10-25 用promise.all搭配map方法解決異步問題
- 2022-08-26 C++?超詳細示例講解list的使用_C 語言
- 2022-04-01 17條提高工作效率的Python技巧分享_python
- 2022-04-09 一起來學習一下python的數據類型_python
- 2022-05-19 C++實現職工工資管理系統課程設計_C 語言
- 2023-04-03 Golang?filepath包常用函數詳解_Golang
- 2022-05-24 .NET?Core剪裁器背后的技術及工作原理介紹_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支