{"id":6300,"date":"2024-07-10T19:16:49","date_gmt":"2024-07-10T11:16:49","guid":{"rendered":"https:\/\/t.n-years.com\/?p=6300"},"modified":"2024-07-10T19:31:58","modified_gmt":"2024-07-10T11:31:58","slug":"swift-%e8%af%ad%e8%a8%80%e9%9d%a2%e8%af%95%e8%a6%81%e7%82%b9%e5%8f%8a%e5%8f%82%e8%80%83%e7%ad%94%e6%a1%88","status":"publish","type":"post","link":"https:\/\/t.n-years.com\/?p=6300","title":{"rendered":"Swift \u8bed\u8a00\u9762\u8bd5\u8981\u70b9\u53ca\u53c2\u8003\u7b54\u6848"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u975e\u539f\u521b\uff0cChatGPT \u95ee\u7b54\u751f\u6210<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728Swift\u8bed\u8a00\u7684\u9762\u8bd5\u4e2d\uff0c\u901a\u5e38\u4f1a\u6db5\u76d6\u591a\u4e2a\u9886\u57df\uff0c\u5305\u62ec\u57fa\u7840\u8bed\u6cd5\u3001\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u3001\u5185\u5b58\u7ba1\u7406\u3001\u5e76\u53d1\u5904\u7406\u7b49\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5e38\u89c1\u7684\u9762\u8bd5\u8981\u70b9\u53ca\u53c2\u8003\u7b54\u6848\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u57fa\u7840\u8bed\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u53d8\u91cf\u548c\u5e38\u91cf<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf\u548c\u5e38\u91cf\uff1f\u5b83\u4eec\u6709\u4ec0\u4e48\u533a\u522b\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u7528<code>var<\/code>\u58f0\u660e\u53d8\u91cf\uff0c\u7528<code>let<\/code>\u58f0\u660e\u5e38\u91cf\u3002\u53d8\u91cf\u7684\u503c\u53ef\u4ee5\u6539\u53d8\uff0c\u5e38\u91cf\u7684\u503c\u4e00\u65e6\u8bbe\u5b9a\u5c31\u4e0d\u80fd\u6539\u53d8\u3002<\/li><\/ul><code>var variable = 10 let constant = 20<\/code><\/li>\n\n\n\n<li><strong>\u6570\u636e\u7c7b\u578b<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1aSwift\u4e2d\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6709\u54ea\u4e9b\uff1f<\/li>\n\n\n\n<li><strong>\u7b54\u6848<\/strong>\uff1a\u5e38\u89c1\u7684\u6709<code>Int<\/code>, <code>Float<\/code>, <code>Double<\/code>, <code>Bool<\/code>, <code>String<\/code>, <code>Character<\/code>\u3002<br><code>swift let intValue: Int = 42 let floatValue: Float = 3.14 let doubleValue: Double = 3.14159 let boolValue: Bool = true let stringValue: String = \"Hello\" let charValue: Character = \"A\"<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u63a7\u5236\u6d41<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6761\u4ef6\u8bed\u53e5<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u4f7f\u7528if\u8bed\u53e5\u8fdb\u884c\u6761\u4ef6\u5224\u65ad\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a<\/li><\/ul><code>let score = 85 if score &gt; 90 { print(\"Excellent\") } else if score &gt; 75 { print(\"Good\") } else { print(\"Needs Improvement\") }<\/code><\/li>\n\n\n\n<li><strong>\u5faa\u73af\u8bed\u53e5<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u4f7f\u7528for-in\u5faa\u73af\u904d\u5386\u4e00\u4e2a\u6570\u7ec4\uff1f<\/li>\n\n\n\n<li><strong>\u7b54\u6848<\/strong>\uff1a<br><code>swift let array = [1, 2, 3, 4, 5] for number in array { print(number) }<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u7c7b\u548c\u7ed3\u6784\u4f53<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u7c7b\u548c\u7ed3\u6784\u4f53\u6709\u4ec0\u4e48\u533a\u522b\uff1f\u5982\u4f55\u58f0\u660e\u5b83\u4eec\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u7c7b\u662f\u5f15\u7528\u7c7b\u578b\uff0c\u53ef\u4ee5\u7ee7\u627f\uff1b\u7ed3\u6784\u4f53\u662f\u503c\u7c7b\u578b\uff0c\u4e0d\u80fd\u7ee7\u627f\u3002<\/li><\/ul><code>class Person { var name: String init(name: String) { self.name = name } } struct Point { var x: Int var y: Int }<\/code><\/li>\n\n\n\n<li><strong>\u7ee7\u627f\u548c\u591a\u6001<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u5b9e\u73b0\u7c7b\u7684\u7ee7\u627f\u548c\u591a\u6001\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a<\/li><\/ul><code>class Animal { func sound() { print(\"Some sound\") } } class Dog: Animal { override func sound() { print(\"Bark\") } } let myDog: Animal = Dog() myDog.sound() \/\/ \u8f93\u51fa \"Bark\"<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5185\u5b58\u7ba1\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>ARC (Automatic Reference Counting)<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662fARC\uff1f\u5982\u4f55\u907f\u514d\u5faa\u73af\u5f15\u7528\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1aARC\u81ea\u52a8\u7ba1\u7406\u5bf9\u8c61\u7684\u5185\u5b58\u3002\u4e3a\u4e86\u907f\u514d\u5faa\u73af\u5f15\u7528\uff0c\u53ef\u4ee5\u4f7f\u7528<code>weak<\/code>\u6216<code>unowned<\/code>\u5173\u952e\u5b57\u3002<\/li><\/ul><code>class Person { var name: String init(name: String) { self.name = name } var apartment: Apartment? } class Apartment { var unit: String weak var tenant: Person? init(unit: String) { self.unit = unit } } var john: Person? = Person(name: \"John\") var unit4A: Apartment? = Apartment(unit: \"4A\") john?.apartment = unit4A unit4A?.tenant = john<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5e76\u53d1\u5904\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>GCD (Grand Central Dispatch)<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528GCD\u5b9e\u73b0\u5f02\u6b65\u4efb\u52a1\uff1f<\/li>\n\n\n\n<li><strong>\u7b54\u6848<\/strong>\uff1a<br><code>swift DispatchQueue.global().async { \/\/ \u5f02\u6b65\u4efb\u52a1 print(\"This is an async task\") DispatchQueue.main.async { \/\/ \u4e3b\u7ebf\u7a0b\u4efb\u52a1 print(\"Back to main thread\") } }<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u95ed\u5305<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u95ed\u5305<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u95ed\u5305\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u95ed\u5305\uff1f<\/li>\n\n\n\n<li><strong>\u7b54\u6848<\/strong>\uff1a\u95ed\u5305\u662f\u81ea\u5305\u542b\u7684\u51fd\u6570\u4ee3\u7801\u5757\uff0c\u53ef\u4ee5\u5728\u4ee3\u7801\u4e2d\u88ab\u4f20\u9012\u548c\u4f7f\u7528\u3002<br><code>swift let closure = { (name: String) -&gt; String in return \"Hello, \\(name)\" } let greeting = closure(\"World\") print(greeting) \/\/ \u8f93\u51fa \"Hello, World\"<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u9ad8\u7ea7\u4e3b\u9898<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u534f\u8bae<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u534f\u8bae\uff1f\u5982\u4f55\u5b9a\u4e49\u548c\u4f7f\u7528\u534f\u8bae\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u534f\u8bae\u5b9a\u4e49\u4e86\u5b9e\u73b0\u67d0\u4e00\u7279\u6027\u6216\u529f\u80fd\u6240\u9700\u7684\u65b9\u6cd5\u548c\u5c5e\u6027\u3002<\/li><\/ul><code>protocol Greetable { var name: String { get } func greet() -&gt; String } class Person: Greetable { var name: String init(name: String) { self.name = name } func greet() -&gt; String { return \"Hello, \\(name)\" } } let person = Person(name: \"John\") print(person.greet()) \/\/ \u8f93\u51fa \"Hello, John\"<\/code><\/li>\n\n\n\n<li><strong>\u6269\u5c55<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u4f7f\u7528\u6269\u5c55\u4e3a\u73b0\u6709\u7c7b\u578b\u6dfb\u52a0\u65b0\u529f\u80fd\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a<\/li><\/ul><code>extension Int { func squared() -&gt; Int { return self * self } } let number = 5 print(number.squared()) \/\/ \u8f93\u51fa 25<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u95ee\uff1a\u592a\u7b80\u5355\u4e86\uff0c\u52a0\u5927\u70b9\u96be\u5ea6<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u7136\uff0c\u4ee5\u4e0b\u662f\u4e00\u4e9b\u66f4\u9ad8\u7ea7\u7684Swift\u9762\u8bd5\u95ee\u9898\u548c\u7b54\u6848\uff0c\u6db5\u76d6\u66f4\u591a\u590d\u6742\u7684\u4e3b\u9898\uff0c\u5982\u9ad8\u7ea7\u8bed\u6cd5\u3001\u6027\u80fd\u4f18\u5316\u3001\u9ad8\u7ea7\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u548c\u5e76\u53d1\u5904\u7406\u7b49\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u9ad8\u7ea7\u8bed\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9ad8\u9636\u51fd\u6570<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u9ad8\u9636\u51fd\u6570\uff1f\u7ed9\u51fa\u4e00\u4e2a\u4f7f\u7528\u9ad8\u9636\u51fd\u6570\u7684\u4f8b\u5b50\u3002<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u9ad8\u9636\u51fd\u6570\u662f\u53ef\u4ee5\u63a5\u53d7\u5176\u4ed6\u51fd\u6570\u4f5c\u4e3a\u53c2\u6570\u6216\u8fd4\u56de\u4e00\u4e2a\u51fd\u6570\u7684\u51fd\u6570\u3002\u793a\u4f8b\uff1a<\/li><\/ul><code>func applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -&gt; Int) -&gt; Int { return operation(a, b) } let sum = applyOperation(4, 2, operation: { $0 + $1 }) let product = applyOperation(4, 2, operation: { $0 * $1 }) print(sum) \/\/ \u8f93\u51fa 6 print(product) \/\/ \u8f93\u51fa 8<\/code><\/li>\n\n\n\n<li><strong>\u6cdb\u578b<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u6cdb\u578b\uff1f\u7ed9\u51fa\u4e00\u4e2a\u6cdb\u578b\u51fd\u6570\u7684\u793a\u4f8b\u3002<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u6cdb\u578b\u4f7f\u5f97\u51fd\u6570\u548c\u7c7b\u578b\u53ef\u4ee5\u9002\u7528\u4e8e\u4efb\u4f55\u7c7b\u578b\u3002\u793a\u4f8b\uff1a<\/li><\/ul><code>func swapTwoValues&lt;T&gt;(_ a: inout T, _ b: inout T) { let temp = a a = b b = temp } var int1 = 3 var int2 = 107 swapTwoValues(&amp;int1, &amp;int2) print(int1) \/\/ \u8f93\u51fa 107 print(int2) \/\/ \u8f93\u51fa 3 var str1 = \"hello\" var str2 = \"world\" swapTwoValues(&amp;str1, &amp;str2) print(str1) \/\/ \u8f93\u51fa \"world\" print(str2) \/\/ \u8f93\u51fa \"hello\"<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u6027\u80fd\u4f18\u5316<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u503c\u7c7b\u578b\u548c\u5f15\u7528\u7c7b\u578b<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1aSwift\u4e2d\u7684\u503c\u7c7b\u578b\u548c\u5f15\u7528\u7c7b\u578b\u6709\u4ec0\u4e48\u533a\u522b\uff1f\u5982\u4f55\u9009\u62e9\u4f7f\u7528\u5b83\u4eec\uff1f<\/li>\n\n\n\n<li><strong>\u7b54\u6848<\/strong>\uff1a\u503c\u7c7b\u578b\uff08\u5982\u7ed3\u6784\u4f53\u548c\u679a\u4e3e\uff09\u5728\u8d4b\u503c\u548c\u4f20\u9012\u65f6\u4f1a\u8fdb\u884c\u62f7\u8d1d\uff0c\u5f15\u7528\u7c7b\u578b\uff08\u5982\u7c7b\uff09\u5728\u8d4b\u503c\u548c\u4f20\u9012\u65f6\u5171\u4eab\u540c\u4e00\u4e2a\u5b9e\u4f8b\u3002\u9009\u62e9\u4f7f\u7528\u5b83\u4eec\u65f6\uff0c\u503c\u7c7b\u578b\u9002\u5408\u7b80\u5355\u6570\u636e\u7ed3\u6784\u548c\u4e0d\u9700\u8981\u5171\u4eab\u7684\u573a\u666f\uff0c\u800c\u5f15\u7528\u7c7b\u578b\u9002\u5408\u9700\u8981\u5171\u4eab\u548c\u53ef\u53d8\u72b6\u6001\u7684\u573a\u666f\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u61d2\u52a0\u8f7d<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u61d2\u52a0\u8f7d\uff1f\u5982\u4f55\u5728Swift\u4e2d\u5b9e\u73b0\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u61d2\u52a0\u8f7d\u662f\u6307\u5728\u9700\u8981\u65f6\u624d\u8fdb\u884c\u521d\u59cb\u5316\u3002\u4f7f\u7528<code>lazy<\/code>\u5173\u952e\u5b57\u3002<\/li><\/ul><code>class DataLoader { lazy var data: [String] = { var tempData = [String]() for i in 1...1000 { tempData.append(\"Item \\(i)\") } return tempData }() } let loader = DataLoader() print(loader.data[0]) \/\/ \u8bbf\u95eedata\u65f6\u624d\u8fdb\u884c\u521d\u59cb\u5316<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u9ad8\u7ea7\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u534f\u8bae\u6269\u5c55<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u534f\u8bae\u6269\u5c55\uff1f\u5982\u4f55\u4f7f\u7528\u534f\u8bae\u6269\u5c55\u4e3a\u534f\u8bae\u6dfb\u52a0\u9ed8\u8ba4\u5b9e\u73b0\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u534f\u8bae\u6269\u5c55\u5141\u8bb8\u4e3a\u534f\u8bae\u63d0\u4f9b\u9ed8\u8ba4\u5b9e\u73b0\uff0c\u4f7f\u5f97\u9075\u5faa\u534f\u8bae\u7684\u7c7b\u578b\u53ef\u4ee5\u81ea\u52a8\u83b7\u5f97\u8fd9\u4e9b\u5b9e\u73b0\u3002<\/li><\/ul><code>protocol Describable { func describe() -&gt; String } extension Describable { func describe() -&gt; String { return \"This is a describable item.\" } } struct Item: Describable {} let item = Item() print(item.describe()) \/\/ \u8f93\u51fa \"This is a describable item.\"<\/code><\/li>\n\n\n\n<li><strong>\u5173\u8054\u7c7b\u578b<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u5173\u8054\u7c7b\u578b\uff1f\u5982\u4f55\u5728\u534f\u8bae\u4e2d\u4f7f\u7528\u5173\u8054\u7c7b\u578b\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u5173\u8054\u7c7b\u578b\u662f\u534f\u8bae\u4e2d\u7528\u4e8e\u5360\u4f4d\u7684\u7c7b\u578b\uff0c\u53ef\u4ee5\u5728\u9075\u5faa\u534f\u8bae\u7684\u7c7b\u578b\u4e2d\u5177\u4f53\u5316\u3002<\/li><\/ul><code>protocol Container { associatedtype Item var items: [Item] { get set } mutating func addItem(_ item: Item) } struct IntContainer: Container { var items = [Int]() mutating func addItem(_ item: Int) { items.append(item) } } var intContainer = IntContainer() intContainer.addItem(3) print(intContainer.items) \/\/ \u8f93\u51fa [3]<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5e76\u53d1\u5904\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u64cd\u4f5c\u961f\u5217<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u64cd\u4f5c\u961f\u5217\uff08Operation Queue\uff09\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u5b83\u4eec\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u64cd\u4f5c\u961f\u5217\u7ba1\u7406\u5e76\u53d1\u64cd\u4f5c\u7684\u6267\u884c\uff0c\u5229\u7528<code>Operation<\/code>\u7c7b\u8fdb\u884c\u4efb\u52a1\u7ba1\u7406\u3002<\/li><\/ul><code>let queue = OperationQueue() let operation1 = BlockOperation { print(\"Operation 1\") } let operation2 = BlockOperation { print(\"Operation 2\") } operation2.addDependency(operation1) \/\/ \u786e\u4fddoperation2\u5728operation1\u4e4b\u540e\u6267\u884c queue.addOperation(operation1) queue.addOperation(operation2)<\/code><\/li>\n\n\n\n<li><strong>\u5f02\u6b65\u5e8f\u5217\u548c\u5f02\u6b65\u6d41<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u5f02\u6b65\u5e8f\u5217\uff08AsyncSequence\uff09\u548c\u5f02\u6b65\u6d41\uff08AsyncStream\uff09\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u4f7f\u7528<code>AsyncSequence<\/code>\u548c<code>AsyncStream<\/code>\u5904\u7406\u5f02\u6b65\u6570\u636e\u6d41\u3002<\/li><\/ul><code>func asyncNumbers() -&gt; AsyncStream&lt;Int&gt; { return AsyncStream { continuation in for i in 1...5 { continuation.yield(i) } continuation.finish() } } Task { for await number in asyncNumbers() { print(number) } }<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5176\u4ed6\u9ad8\u7ea7\u4e3b\u9898<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u51fd\u6570\u5f0f\u7f16\u7a0b<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1aSwift\u4e2d\u5982\u4f55\u5e94\u7528\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u6982\u5ff5\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u4f7f\u7528\u4e0d\u53ef\u53d8\u6570\u636e\u7ed3\u6784\u548c\u9ad8\u9636\u51fd\u6570\uff0c\u5982<code>map<\/code>\u3001<code>filter<\/code>\u3001<code>reduce<\/code>\u7b49\u3002<\/li><\/ul><code>let numbers = [1, 2, 3, 4, 5] let squaredNumbers = numbers.map { $0 * $0 } let evenNumbers = numbers.filter { $0 % 2 == 0 } let sum = numbers.reduce(0, +) print(squaredNumbers) \/\/ \u8f93\u51fa [1, 4, 9, 16, 25] print(evenNumbers) \/\/ \u8f93\u51fa [2, 4] print(sum) \/\/ \u8f93\u51fa 15<\/code><\/li>\n\n\n\n<li><strong>\u5c5e\u6027\u5305\u88c5\u5668<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u5c5e\u6027\u5305\u88c5\u5668\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u5c5e\u6027\u5305\u88c5\u5668\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u5c5e\u6027\u5305\u88c5\u5668\u7528\u4e8e\u5c01\u88c5\u5c5e\u6027\u7684<code>get<\/code>\u548c<code>set<\/code>\u903b\u8f91\u3002<\/li><\/ul><code>@propertyWrapper struct UpperCase { private var value: String = \"\" var wrappedValue: String { get { return value } set { value = newValue.uppercased() } } } struct Person { @UpperCase var name: String } var person = Person() person.name = \"john\" print(person.name) \/\/ \u8f93\u51fa \"JOHN\"<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u9ad8\u7ea7\u95ee\u9898\u548c\u793a\u4f8b\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5728Swift\u9762\u8bd5\u4e2d\u5c55\u793a\u5bf9\u66f4\u590d\u6742\u4e3b\u9898\u7684\u638c\u63e1\uff0c\u5c55\u73b0\u4f60\u89e3\u51b3\u5b9e\u9645\u5f00\u53d1\u95ee\u9898\u7684\u80fd\u529b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u597d\u7684\uff0c\u4ee5\u4e0b\u662f\u66f4\u591a\u9ad8\u7ea7\u7684Swift\u9762\u8bd5\u95ee\u9898\u53ca\u7b54\u6848\uff0c\u6db5\u76d6\u66f4\u591a\u6df1\u5c42\u6b21\u7684Swift\u7279\u6027\u548c\u5e94\u7528\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u9ad8\u7ea7\u8bed\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Result\u7c7b\u578b<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f<code>Result<\/code>\u7c7b\u578b\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u5b83\u8fdb\u884c\u9519\u8bef\u5904\u7406\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a<code>Result<\/code>\u7c7b\u578b\u8868\u793a\u4e00\u4e2a\u64cd\u4f5c\u7684\u6210\u529f\u6216\u5931\u8d25\uff0c\u5177\u6709\u4e24\u79cd\u53ef\u80fd\u7684\u72b6\u6001\uff1a<code>success<\/code>\u548c<code>failure<\/code>\u3002<\/li><\/ul><code>enum NetworkError: Error { case badURL case requestFailed } func fetchData(from url: String) -> Result&lt;Data, NetworkError> { guard url == \"https:\/\/valid.url\" else { return .failure(.badURL) } \/\/ \u6a21\u62df\u6210\u529f\u7684\u6570\u636e\u8fd4\u56de let data = Data() return .success(data) } let result = fetchData(from: \"https:\/\/valid.url\") switch result { case .success(let data): print(\"Data received: \\(data)\") case .failure(let error): print(\"Error: \\(error)\") }<\/code><\/li>\n\n\n\n<li><strong>\u5185\u8054\u95ed\u5305\u548c\u5c3e\u968f\u95ed\u5305<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u5c3e\u968f\u95ed\u5305\uff1f\u4e3e\u4e00\u4e2a\u4f7f\u7528\u5c3e\u968f\u95ed\u5305\u7684\u793a\u4f8b\u3002<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u5c3e\u968f\u95ed\u5305\u662f\u51fd\u6570\u53c2\u6570\u5217\u8868\u4e4b\u540e\u4e66\u5199\u7684\u95ed\u5305\u8868\u8fbe\u5f0f\u3002\u5f53\u95ed\u5305\u662f\u51fd\u6570\u7684\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u8fd9\u79cd\u8bed\u6cd5\u3002<\/li><\/ul><code>func performOperation(with closure: () -> Void) { closure() } \/\/ \u4f7f\u7528\u5185\u8054\u95ed\u5305 performOperation(with: { print(\"Inline closure executed\") }) \/\/ \u4f7f\u7528\u5c3e\u968f\u95ed\u5305 performOperation { print(\"Trailing closure executed\") }<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u9ad8\u7ea7\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u62bd\u8c61\u7c7b<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1aSwift\u4e2d\u5982\u4f55\u6a21\u62df\u62bd\u8c61\u7c7b\u7684\u884c\u4e3a\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u53ef\u4ee5\u901a\u8fc7\u5b9a\u4e49\u534f\u8bae\u5e76\u63d0\u4f9b\u534f\u8bae\u6269\u5c55\u7684\u9ed8\u8ba4\u5b9e\u73b0\u6765\u6a21\u62df\u62bd\u8c61\u7c7b\u7684\u884c\u4e3a\u3002<\/li><\/ul><code>protocol Animal { var name: String { get } func makeSound() } extension Animal { func describe() { print(\"I am \\(name)\") } } class Dog: Animal { var name: String init(name: String) { self.name = name } func makeSound() { print(\"Bark\") } } let dog = Dog(name: \"Buddy\") dog.describe() \/\/ \u8f93\u51fa \"I am Buddy\" dog.makeSound() \/\/ \u8f93\u51fa \"Bark\"<\/code><\/li>\n\n\n\n<li><strong>\u534f\u8bae\u7ec4\u5408<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u534f\u8bae\u7ec4\u5408\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u5b83\u4eec\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u534f\u8bae\u7ec4\u5408\u5141\u8bb8\u5c06\u591a\u4e2a\u534f\u8bae\u7ec4\u5408\u6210\u4e00\u4e2a\u7c7b\u578b\u8981\u6c42\u3002<\/li><\/ul><code>protocol Named { var name: String { get } } protocol Aged { var age: Int { get } } struct Person: Named, Aged { var name: String var age: Int } func celebrateBirthday(of celebrator: Named &amp; Aged) { print(\"Happy birthday, \\(celebrator.name), now you are \\(celebrator.age) years old!\") } let person = Person(name: \"John\", age: 30) celebrateBirthday(of: person) \/\/ \u8f93\u51fa \"Happy birthday, John, now you are 30 years old!\"<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5e76\u53d1\u5904\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>DispatchGroup<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f<code>DispatchGroup<\/code>\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u5b83\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a<code>DispatchGroup<\/code>\u5141\u8bb8\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\u540c\u6b65\u5b8c\u6210\u540e\u6267\u884c\u4ee3\u7801\u5757\u3002<\/li><\/ul><code>let group = DispatchGroup() group.enter() DispatchQueue.global().async { print(\"Task 1 started\") sleep(2) print(\"Task 1 completed\") group.leave() } group.enter() DispatchQueue.global().async { print(\"Task 2 started\") sleep(1) print(\"Task 2 completed\") group.leave() } group.notify(queue: .main) { print(\"All tasks completed\") }<\/code><\/li>\n\n\n\n<li><strong>Semaphore<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u4fe1\u53f7\u91cf\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u4fe1\u53f7\u91cf\u63a7\u5236\u5e76\u53d1\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u4fe1\u53f7\u91cf\u7528\u4e8e\u9650\u5236\u540c\u65f6\u6267\u884c\u7684\u5e76\u53d1\u4efb\u52a1\u6570\u3002<\/li><\/ul><code>let semaphore = DispatchSemaphore(value: 2) for i in 1...5 { DispatchQueue.global().async { semaphore.wait() print(\"Task \\(i) started\") sleep(2) print(\"Task \\(i) completed\") semaphore.signal() } }<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5185\u5b58\u7ba1\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5faa\u73af\u5f15\u7528\u548c\u89e3\u51b3\u65b9\u6848<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u5faa\u73af\u5f15\u7528\uff1f\u5982\u4f55\u5728Swift\u4e2d\u89e3\u51b3\u5b83\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u5faa\u73af\u5f15\u7528\u53d1\u751f\u5728\u4e24\u4e2a\u5bf9\u8c61\u4e92\u76f8\u6301\u6709\u5bf9\u65b9\uff0c\u5bfc\u81f4\u5185\u5b58\u65e0\u6cd5\u91ca\u653e\u3002\u53ef\u4ee5\u4f7f\u7528<code>weak<\/code>\u6216<code>unowned<\/code>\u5173\u952e\u5b57\u89e3\u51b3\u3002<\/li><\/ul><code>class Person { var name: String var apartment: Apartment? init(name: String) { self.name = name } deinit { print(\"\\(name) is being deinitialized\") } } class Apartment { var unit: String weak var tenant: Person? init(unit: String) { self.unit = unit } deinit { print(\"Apartment \\(unit) is being deinitialized\") } } var john: Person? = Person(name: \"John\") var unit4A: Apartment? = Apartment(unit: \"4A\") john?.apartment = unit4A unit4A?.tenant = john john = nil unit4A = nil \/\/ \u8f93\u51fa \"John is being deinitialized\" \u548c \"Apartment 4A is being deinitialized\"<\/code><\/li>\n\n\n\n<li><strong>\u9003\u9038\u95ed\u5305<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u9003\u9038\u95ed\u5305\uff1f\u5982\u4f55\u5728Swift\u4e2d\u5b9a\u4e49\u548c\u4f7f\u7528\u5b83\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u9003\u9038\u95ed\u5305\u662f\u6307\u5728\u51fd\u6570\u8fd4\u56de\u4e4b\u540e\u624d\u6267\u884c\u7684\u95ed\u5305\u3002\u4f7f\u7528<code>@escaping<\/code>\u6807\u8bb0\u3002<\/li><\/ul><code>func performAsyncTask(completion: @escaping () -> Void) { DispatchQueue.global().async { print(\"Performing async task\") completion() } } performAsyncTask { print(\"Task completed\") }<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5176\u4ed6\u9ad8\u7ea7\u4e3b\u9898<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>KVC \u548c KVO<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1aSwift\u4e2d\u5982\u4f55\u5b9e\u73b0Key-Value Coding (KVC) \u548c Key-Value Observing (KVO)\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1aSwift\u53ef\u4ee5\u901a\u8fc7\u7ee7\u627f\u81ea<code>NSObject<\/code>\u5e76\u4f7f\u7528<code>@objc<\/code>\u6807\u8bb0\u5c5e\u6027\u6765\u5b9e\u73b0KVC\u548cKVO\u3002<\/li><\/ul><code>class Person: NSObject { @objc dynamic var name: String init(name: String) { self.name = name } } let person = Person(name: \"John\") let observation = person.observe(\\.name, options: [.new, .old]) { person, change in print(\"Name changed from \\(change.oldValue!) to \\(change.newValue!)\") } person.name = \"Jane\" \/\/ \u8f93\u51fa \"Name changed from John to Jane\"<\/code><\/li>\n\n\n\n<li><strong>\u6a21\u5f0f\u5339\u914d<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1aSwift\u4e2d\u5982\u4f55\u4f7f\u7528\u6a21\u5f0f\u5339\u914d\uff08Pattern Matching\uff09\uff1f<strong>\u7b54\u6848<\/strong>\uff1a\u53ef\u4ee5\u5728<code>switch<\/code>\u8bed\u53e5\u3001<code>if-case<\/code>\u8bed\u53e5\u4e2d\u4f7f\u7528\u6a21\u5f0f\u5339\u914d\u3002<\/li><\/ul><code>enum Direction { case north case south case east case west } let direction: Direction = .north switch direction { case .north: print(\"Going north\") case .south: print(\"Going south\") case .east: print(\"Going east\") case .west: print(\"Going west\") } let point = (x: 1, y: 1) if case (0, 0) = point { print(\"At the origin\") } else { print(\"Not at the origin\") }<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u9ad8\u7ea7\u95ee\u9898\u548c\u793a\u4f8b\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5e2e\u52a9\u4f60\u5728Swift\u9762\u8bd5\u4e2d\u5c55\u793a\u4f60\u5bf9\u590d\u6742\u4e3b\u9898\u7684\u638c\u63e1\uff0c\u4ee5\u53ca\u89e3\u51b3\u5b9e\u9645\u5f00\u53d1\u95ee\u9898\u7684\u80fd\u529b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u7136\uff0c\u4ee5\u4e0b\u662f\u66f4\u591a\u9ad8\u7ea7\u7684Swift\u9762\u8bd5\u95ee\u9898\u53ca\u7b54\u6848\uff0c\u8fdb\u4e00\u6b65\u6db5\u76d6\u590d\u6742\u7684Swift\u7279\u6027\u548c\u5e94\u7528\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u9ad8\u7ea7\u8bed\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9690\u5f0f\u5c55\u5f00\u7684\u53ef\u9009\u503c<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u9690\u5f0f\u5c55\u5f00\u7684\u53ef\u9009\u503c\uff1f\u5b83\u4eec\u4e0e\u666e\u901a\u53ef\u9009\u503c\u6709\u4ec0\u4e48\u533a\u522b\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u9690\u5f0f\u5c55\u5f00\u7684\u53ef\u9009\u503c\u5728\u58f0\u660e\u65f6\u7528\u611f\u53f9\u53f7<code>!<\/code>\u8868\u793a\uff0c\u8868\u793a\u8be5\u503c\u5728\u4f7f\u7528\u65f6\u53ef\u4ee5\u76f4\u63a5\u89e3\u5305\u3002<\/li><\/ul><code>var implicitlyUnwrappedOptional: String! = \"Hello\" let value: String = implicitlyUnwrappedOptional \/\/ \u81ea\u52a8\u89e3\u5305 print(value) \/\/ \u8f93\u51fa \"Hello\"<\/code><\/li>\n\n\n\n<li><strong>\u52a8\u6001\u7c7b\u578b<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662fSwift\u4e2d\u7684\u52a8\u6001\u7c7b\u578b\uff1f\u5982\u4f55\u4f7f\u7528<code>Any<\/code>\u548c<code>AnyObject<\/code>\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a<code>Any<\/code>\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7c7b\u578b\uff0c\u5305\u62ec\u51fd\u6570\u7c7b\u578b\uff0c<code>AnyObject<\/code>\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7c7b\u7c7b\u578b\u7684\u5b9e\u4f8b\u3002<\/li><\/ul><code>var anyValue: Any = 42 anyValue = \"Hello\" anyValue = [1, 2, 3] var anyObjectValue: AnyObject = NSString(string: \"Hello\") anyObjectValue = NSNumber(value: 42)<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u9ad8\u7ea7\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u7c7b\u578b\u64e6\u9664<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u7c7b\u578b\u64e6\u9664\uff1f\u5982\u4f55\u5728Swift\u4e2d\u5b9e\u73b0\u7c7b\u578b\u64e6\u9664\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u7c7b\u578b\u64e6\u9664\u7528\u4e8e\u9690\u85cf\u7c7b\u578b\u4fe1\u606f\uff0c\u53ef\u4ee5\u4f7f\u7528\u6cdb\u578b\u548c\u534f\u8bae\u6765\u5b9e\u73b0\u3002<\/li><\/ul><code>protocol AnyBox { associatedtype ValueType var value: ValueType { get } } struct Box&lt;T>: AnyBox { typealias ValueType = T var value: T } struct AnyBoxWrapper&lt;Value>: AnyBox { private let _value: () -> Value var value: Value { return _value() }init&amp;lt;T: AnyBox&amp;gt;(_ box: T) where T.ValueType == Value { _value = { box.value } }} let intBox = Box(value: 42) let stringBox = Box(value: \"Hello\") let anyBox1 = AnyBoxWrapper(intBox) let anyBox2 = AnyBoxWrapper(stringBox) print(anyBox1.value) \/\/ \u8f93\u51fa 42 print(anyBox2.value) \/\/ \u8f93\u51fa \"Hello\"<\/code><\/li>\n\n\n\n<li><strong>\u591a\u91cd\u7ee7\u627f\u548c\u534f\u8bae\u7ee7\u627f<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1aSwift\u5982\u4f55\u5b9e\u73b0\u591a\u91cd\u7ee7\u627f\uff1f\u4ec0\u4e48\u662f\u534f\u8bae\u7ee7\u627f\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1aSwift\u4e0d\u652f\u6301\u7c7b\u7684\u591a\u91cd\u7ee7\u627f\uff0c\u4f46\u53ef\u4ee5\u901a\u8fc7\u534f\u8bae\u7ee7\u627f\u5b9e\u73b0\u7c7b\u4f3c\u7684\u529f\u80fd\u3002<\/li><\/ul><code>protocol Runnable { func run() } protocol Swimmable { func swim() } class Animal {} class Duck: Animal, Runnable, Swimmable { func run() { print(\"Duck is running\") } func swim() { print(\"Duck is swimming\") } } let duck = Duck() duck.run() \/\/ \u8f93\u51fa \"Duck is running\" duck.swim() \/\/ \u8f93\u51fa \"Duck is swimming\"<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5e76\u53d1\u5904\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4efb\u52a1\u7ec4\uff08Task Group\uff09<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u4efb\u52a1\u7ec4\u5e76\u53d1\u6267\u884c\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u4f7f\u7528<code>TaskGroup<\/code>\u53ef\u4ee5\u5e76\u53d1\u6267\u884c\u591a\u4e2a\u5f02\u6b65\u4efb\u52a1\u5e76\u7b49\u5f85\u6240\u6709\u4efb\u52a1\u5b8c\u6210\u3002<\/li><\/ul><code>import _Concurrency func fetchData(from url: String) async -> String { return \"Data from \\(url)\" } func performConcurrentTasks() async { await withTaskGroup(of: String.self) { group in group.addTask { await fetchData(from: \"https:\/\/api.example.com\/1\") } group.addTask { await fetchData(from: \"https:\/\/api.example.com\/2\") } group.addTask { await fetchData(from: \"https:\/\/api.example.com\/3\") } for await result in group { print(result) } }} Task { await performConcurrentTasks() }<\/code><\/li>\n\n\n\n<li><strong>Actor<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662fActor\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528Actor\u8fdb\u884c\u5e76\u53d1\u7f16\u7a0b\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1aActor\u662f\u4e00\u79cd\u4fdd\u62a4\u5176\u5185\u90e8\u72b6\u6001\u4e0d\u88ab\u591a\u7ebf\u7a0b\u540c\u65f6\u8bbf\u95ee\u7684\u5f15\u7528\u7c7b\u578b\u3002<\/li><\/ul><code>actor Counter { private var value = 0func increment() { value += 1 } func getValue() -&amp;gt; Int { return value }} let counter = Counter() Task { await counter.increment() let value = await counter.getValue() print(value) \/\/ \u8f93\u51fa 1 }<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5185\u5b58\u7ba1\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Unowned \u5f15\u7528<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f<code>unowned<\/code>\u5f15\u7528\uff1f\u4e0e<code>weak<\/code>\u5f15\u7528\u6709\u4ec0\u4e48\u533a\u522b\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a<code>unowned<\/code>\u5f15\u7528\u4e0d\u4f1a\u6301\u6709\u5bf9\u8c61\uff0c\u4e5f\u4e0d\u4f1a\u81ea\u52a8\u53d8\u4e3anil\u3002\u5982\u679c\u5bf9\u8c61\u88ab\u91ca\u653e\uff0c\u8bbf\u95ee<code>unowned<\/code>\u5f15\u7528\u4f1a\u5bfc\u81f4\u8fd0\u884c\u65f6\u9519\u8bef\u3002<\/li><\/ul><code>class Person { var name: String var car: Car? init(name: String) { self.name = name } } class Car { var model: String unowned var owner: Person init(model: String, owner: Person) { self.model = model self.owner = owner } } var john: Person? = Person(name: \"John\") john?.car = Car(model: \"Tesla\", owner: john!) john = nil \/\/ \u8fd9\u65f6\uff0ccar.owner \u662f\u4e00\u4e2a\u60ac\u7a7a\u5f15\u7528\uff0c\u8bbf\u95ee\u5b83\u4f1a\u5bfc\u81f4\u8fd0\u884c\u65f6\u9519\u8bef<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5176\u4ed6\u9ad8\u7ea7\u4e3b\u9898<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5173\u952e\u8def\u5f84\uff08KeyPath\uff09<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662f\u5173\u952e\u8def\u5f84\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528\u5173\u952e\u8def\u5f84\u8fdb\u884c\u5c5e\u6027\u8bbf\u95ee\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1a\u5173\u952e\u8def\u5f84\u662f\u4e00\u79cd\u5bf9\u7c7b\u578b\u5c5e\u6027\u7684\u5f15\u7528\uff0c\u53ef\u4ee5\u7528\u4e8e\u52a8\u6001\u8bbf\u95ee\u548c\u4fee\u6539\u5c5e\u6027\u503c\u3002<\/li><\/ul><code>struct Person { var name: String var age: Int } let keyPath = \\Person.name var person = Person(name: \"John\", age: 30) let name = person[keyPath: keyPath] print(name) \/\/ \u8f93\u51fa \"John\" person[keyPath: keyPath] = \"Jane\" print(person.name) \/\/ \u8f93\u51fa \"Jane\"<\/code><\/li>\n\n\n\n<li><strong>Combine \u6846\u67b6<\/strong><ul><li><strong>\u95ee\u9898<\/strong>\uff1a\u4ec0\u4e48\u662fCombine\u6846\u67b6\uff1f\u5982\u4f55\u5728Swift\u4e2d\u4f7f\u7528Combine\u8fdb\u884c\u54cd\u5e94\u5f0f\u7f16\u7a0b\uff1f<\/li><li><strong>\u7b54\u6848<\/strong>\uff1aCombine\u662fApple\u63d0\u4f9b\u7684\u54cd\u5e94\u5f0f\u7f16\u7a0b\u6846\u67b6\uff0c\u7528\u4e8e\u5904\u7406\u5f02\u6b65\u4e8b\u4ef6\u6d41\u3002<\/li><\/ul><code>import Combine let publisher = Just(\"Hello, Combine\") let subscriber = Subscribers.Sink&lt;String, Never>( receiveCompletion: { completion in print(\"Completion: \\(completion)\") }, receiveValue: { value in print(\"Value: \\(value)\") } ) publisher.subscribe(subscriber) \/\/ \u8f93\u51fa \"Value: Hello, Combine\" \/\/ \u8f93\u51fa \"Completion: finished\"<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u9ad8\u7ea7\u95ee\u9898\u548c\u793a\u4f8b\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5e2e\u52a9\u4f60\u5728Swift\u9762\u8bd5\u4e2d\u5c55\u793a\u4f60\u5bf9\u66f4\u590d\u6742\u4e3b\u9898\u7684\u638c\u63e1\uff0c\u4ee5\u53ca\u89e3\u51b3\u5b9e\u9645\u5f00\u53d1\u95ee\u9898\u7684\u80fd\u529b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u975e\u539f\u521b\uff0cChatGPT \u95ee\u7b54\u751f\u6210 \u5728Swift\u8bed\u8a00\u7684\u9762\u8bd5\u4e2d\uff0c\u901a\u5e38\u4f1a\u6db5\u76d6\u591a\u4e2a\u9886\u57df\uff0c\u5305\u62ec\u57fa\u7840\u8bed\u6cd5\u3001\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u3001\u5185&#8230; <\/p>\n<div class=\"read-more navbutton\"><a href=\"https:\/\/t.n-years.com\/?p=6300\">\u9605\u8bfb\u66f4\u591a<i class=\"fa fa-angle-double-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-6300","post","type-post","status-publish","format-standard","hentry","category-5"],"_links":{"self":[{"href":"https:\/\/t.n-years.com\/index.php?rest_route=\/wp\/v2\/posts\/6300","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/t.n-years.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/t.n-years.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/t.n-years.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/t.n-years.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6300"}],"version-history":[{"count":4,"href":"https:\/\/t.n-years.com\/index.php?rest_route=\/wp\/v2\/posts\/6300\/revisions"}],"predecessor-version":[{"id":6304,"href":"https:\/\/t.n-years.com\/index.php?rest_route=\/wp\/v2\/posts\/6300\/revisions\/6304"}],"wp:attachment":[{"href":"https:\/\/t.n-years.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/t.n-years.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/t.n-years.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}