From 13991b8b5e18447bb858d070134d45716e6c705b Mon Sep 17 00:00:00 2001 From: Jovins Date: Wed, 6 Mar 2024 17:36:48 +0800 Subject: [PATCH] doc: update docs/swift.md (#558) * fix issue * add extension * update --- docs/swift.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 2 deletions(-) diff --git a/docs/swift.md b/docs/swift.md index b67a529..859d297 100644 --- a/docs/swift.md +++ b/docs/swift.md @@ -1597,7 +1597,7 @@ let order: Dessert = .cake(flavor: "红色") ```swift enum Content { case empty - case text(Strig) + case text(String) case number(Int) } ``` @@ -1606,7 +1606,7 @@ enum Content { ```swift let content = Content.text("Hello") -swithc content { +switch content { case .empty: print("Value is empty") case .text(let value): @@ -1614,6 +1614,10 @@ swithc content { case .number(_): //不调用时,可以省略 print("Value is a number") } +// 或者 +if case .text(let value) = content { + print("Value is \(value)") +} ``` ### 从原始值初始化 @@ -1684,6 +1688,107 @@ currentTraffic.reportAccident() 实例方法改变了枚举的值,则需要将其标记为 `mutating` +扩展 +--- + +### 声明扩展 + +```swift +struct Person { + var name: String + var age: Int + func eat() {} +} +extension Person { + // 添加新功能 +} +extension Person: SomeProtocol { + // 实现协议方法、属性 +} +``` + +### 扩展构造器 + + + +```swift +// 给CGRect结构体提供允许center和size的构造器 +extension CGRect { + init(center: CGPoint, size: CGSize) { + let x: CGFloat = center.x - size.width * 0.5 + let y: CGFloat = center.y - size.height * 0.5 + self.init(origin: CGPoint(x: x, y: y), + size: size) + } +} +let frame = CGRect(center: CGPoint(x: 100, y: 100), + size: CGSize(width: 50, height: 50)) +print("Origin is \(frame.origin)") +``` + +### 扩展可变实例方法 + +```swift +extension Double { + mutating func cube() { + self = self * self * self + } +} +var boxCube: Double = 2.0 +boxCube.cube() +print(boxCube) +``` + +### 扩展方法 + + + +```swift +extension String { + func deletingPrefix(_ prefix: String) -> String { + guard self.hasPrefix(prefix) else { + return self + } + return String(self.dropFirst(prefix.count)) + } +} +print("Hello World".deletingPrefix("He")) +``` + +### 扩展计算属性 + +```swift +// 扩展可以添加计算属性,不能添加存储属性 +extension Double { + var km: Double { self * 1000 } + var m: Double { self } + var cm: Double { self / 100.0 } + var mm: Double { self / 1000.0 } +} +let metric: Double = 30.48.cm +print("1 metric is \(metric.m) meter") +print("1 metric is \(metric.km) kilometer") +``` + +### 扩展存储属性 + + + +```swift +// 但可以通过 objc_getAssociatedObject/objc_setAssociatedObject 实现添加存储属性 +private var fuchsiaKey = "fuchsiaKey" +extension UIColor { + var fuchsia: UIColor? { + get { + return objc_getAssociatedObject(self, &fuchsiaKey) as? UIColor + } + set { + objc_setAssociatedObject(self, &fuchsiaKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } +} +``` + 另见 ----