109
									
								
								docs/swift.md
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								docs/swift.md
									
									
									
									
									
								
							@@ -1597,7 +1597,7 @@ let order: Dessert = .cake(flavor: "红色")
 | 
				
			|||||||
```swift
 | 
					```swift
 | 
				
			||||||
enum Content {
 | 
					enum Content {
 | 
				
			||||||
  case empty
 | 
					  case empty
 | 
				
			||||||
  case text(Strig)
 | 
					  case text(String)
 | 
				
			||||||
  case number(Int)
 | 
					  case number(Int)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@@ -1606,7 +1606,7 @@ enum Content {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```swift
 | 
					```swift
 | 
				
			||||||
let content = Content.text("Hello")
 | 
					let content = Content.text("Hello")
 | 
				
			||||||
swithc content {
 | 
					switch content {
 | 
				
			||||||
  case .empty:
 | 
					  case .empty:
 | 
				
			||||||
    print("Value is empty")
 | 
					    print("Value is empty")
 | 
				
			||||||
  case .text(let value):
 | 
					  case .text(let value):
 | 
				
			||||||
@@ -1614,6 +1614,10 @@ swithc content {
 | 
				
			|||||||
  case .number(_): //不调用时,可以省略
 | 
					  case .number(_): //不调用时,可以省略
 | 
				
			||||||
    print("Value is a number")
 | 
					    print("Value is a number")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					// 或者
 | 
				
			||||||
 | 
					if case .text(let value) = content {
 | 
				
			||||||
 | 
					    print("Value is \(value)")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 从原始值初始化
 | 
					### 从原始值初始化
 | 
				
			||||||
@@ -1684,6 +1688,107 @@ currentTraffic.reportAccident()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
实例方法改变了枚举的值,则需要将其标记为 `mutating`
 | 
					实例方法改变了枚举的值,则需要将其标记为 `mutating`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					扩展
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 声明扩展
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```swift
 | 
				
			||||||
 | 
					struct Person {
 | 
				
			||||||
 | 
					    var name: String
 | 
				
			||||||
 | 
					    var age: Int
 | 
				
			||||||
 | 
					    func eat() {}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					extension Person {
 | 
				
			||||||
 | 
					    // 添加新功能
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					extension Person: SomeProtocol {
 | 
				
			||||||
 | 
					     // 实现协议方法、属性
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 扩展构造器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--rehype:wrap-class=col-span-2-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```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)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 扩展方法
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--rehype:wrap-class=col-span-2-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```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")
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 扩展存储属性
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--rehype:wrap-class=col-span-2-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```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)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
另见
 | 
					另见
 | 
				
			||||||
----
 | 
					----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user