{"id":1582,"date":"2021-01-29T21:25:50","date_gmt":"2021-01-29T13:25:50","guid":{"rendered":"http:\/\/123.57.164.21\/?p=1582"},"modified":"2021-01-29T21:25:50","modified_gmt":"2021-01-29T13:25:50","slug":"swift%e4%b8%ad%e9%80%9a%e8%bf%87-propertywrapper-%e8%ae%a9%e4%bd%a0%e7%9a%84%e4%bb%a3%e7%a0%81%e5%8f%98%e7%9a%84%e6%9b%b4%e7%ae%80%e6%b4%81","status":"publish","type":"post","link":"https:\/\/92it.top\/?p=1582","title":{"rendered":"Swift\u4e2d\u901a\u8fc7 @propertyWrapper \u8ba9\u4f60\u7684\u4ee3\u7801\u53d8\u7684\u66f4\u7b80\u6d01"},"content":{"rendered":"\n<p>\u4ec0\u4e48\u662f@propertyWrapper? \u4ece\u5b57\u9762\u610f\u601d\u53bb\u7406\u89e3 property Wrapper \u5c31\u662f<code>\u5c5e\u6027\u5305\u88f9\u5668<\/code>\u3002\u5b83\u7684<code>\u4f5c\u7528\u5bf9\u8c61<\/code>\u662f<code>\u5c5e\u6027<\/code>\uff0c\u5176<code>\u4e3b\u65e8<\/code>\u5c31\u662f\uff1a\u901a\u8fc7<code>property Wrapper<\/code>\u673a\u5236\uff0c\u5bf9\u4e00\u4e9b\u7c7b\u4f3c\u7684<code>\u5c5e\u6027<\/code>\u7684\u5b9e\u73b0\u4ee3\u7801\u505a\u540c\u4e00\u5c01\u88c5\u3002<\/p>\n\n\n\n<p>\u8bf4\u7b80\u5355\u70b9\uff1a \u901a\u8fc7@propertyWrapper\u53ef\u4ee5\u79fb\u9664\u6389\u4e00\u4e9b\u91cd\u590d\u6216\u8005\u7c7b\u4f3c\u7684\u4ee3\u7801\u3002<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2021\/01\/image-65-1024x474.png\" alt=\"\" class=\"wp-image-1584\" width=\"470\" height=\"217\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65-1024x474.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65-300x139.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65-768x355.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65-830x384.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65-230x106.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65-350x162.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65-480x222.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2021\/01\/image-65.png 1262w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/figure><\/div>\n\n\n\n<p>propertyWrapper\u8fd9\u4e2a\u77e5\u8bc6\u70b9\u4e0d\u96be,\u6bd4\u8f83\u65b0\u800c\u5df2\u3002\u53ea\u8981\u81ea\u5df1\u590d\u5236\u4e0b\u9762\u7684Demo\u5728<code>playGround<\/code>\u91cc\u8dd1\u4e00\u904d\u770b\u4e00\u4e0b\u5c31\u4f1a\u4e86\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u7528UserDefaults\u4fdd\u5b58\u662f\u5426\u663e\u793a\u65b0\u624b\u5f15\u5bfc\u7684\u4f8b\u5b50\u6765\u8ba9\u5927\u5bb6\u6709\u4e00\u4e2a\u76f4\u89c2\u7684\u4e86\u89e3<\/p>\n\n\n\n<p>\u6ca1\u6709@propertyWrapper \u7684\u65f6\u5019\u3002\u3002\ud83d\ude14<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">extension UserDefaults {\n\n    public enum Keys {\n        static let hadShownGuideView = \"had_shown_guide_view\"\n    }\n\n    var hadShownGuideView: Bool {\n        set {\n            set(newValue, forKey: Keys.hadShownGuideView)\n        }\n        get {\n            return bool(forKey: Keys.hadShownGuideView)\n        }\n    }\n}\n\n\/\/\/ \u4e0b\u9762\u7684\u5c31\u662f\u4e1a\u52a1\u4ee3\u7801\u4e86\u3002\nlet hadShownGuide =  UserDefaults.standard.hadShownGuideView \nif !hadShownGuide {\n    \/\/\/ \u663e\u793a\u65b0\u624b\u5f15\u5bfc \u5e76\u4fdd\u5b58\u672c\u5730\u4e3a\u5df2\u663e\u793a\n    showGuideView() \/\/\/ showGuideView\u5177\u4f53\u5b9e\u73b0\u7565\u3002\n    UserDefaults.standard.hadShownGuideView = true\n}<\/pre>\n\n\n\n<p>\u53ef\u662f\u9879\u76ee\u4e2d\u6709\u5f88\u591a\u5730\u65b9\u9700\u8981UserDefaults\u4fdd\u5b58\u672c\u5730\u6570\u636e,\u6570\u636e\u91cf\u591a\u4e86\u8fd9\u6837\u7684<code>\u91cd\u590d\u4ee3\u7801<\/code>\u5c31\u5f88\u591a\u4e86\u3002<\/p>\n\n\n\n<p>\u6709@propertyWrapper \u7684\u65f6\u5019\u3002\u3002\ud83d\ude01<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@propertyWrapper \/\/\/ \u5148\u544a\u8bc9\u7f16\u8bd1\u5668 \u4e0b\u9762\u8fd9\u4e2aUserDefault\u662f\u4e00\u4e2a\u5c5e\u6027\u5305\u88f9\u5668\nstruct UserDefault&lt;T> {\n    \/\/\/\u8fd9\u91cc\u7684\u5c5e\u6027key \u548c defaultValue \u8fd8\u6709init\u65b9\u6cd5\u90fd\u662f\u5b9e\u9645\u4e1a\u52a1\u4e2d\u7684\u4e1a\u52a1\u4ee3\u7801   \n    \/\/\/\u6211\u4eec\u4e0d\u9700\u8981\u8fc7\u591a\u5173\u6ce8\n    let key: String\n    let defaultValue: T\n\n    init(_ key: String, defaultValue: T) {\n        self.key = key\n        self.defaultValue = defaultValue\n    }\n\/\/\/  wrappedValue\u662f@propertyWrapper\u5fc5\u987b\u8981\u5b9e\u73b0\u7684\u5c5e\u6027\n\/\/\/ \u5f53\u64cd\u4f5c\u6211\u4eec\u8981\u5305\u88f9\u7684\u5c5e\u6027\u65f6  \u5176\u5177\u4f53set get\u65b9\u6cd5\u5b9e\u9645\u4e0a\u8d70\u7684\u90fd\u662fwrappedValue \u7684set get \u65b9\u6cd5\u3002 \n    var wrappedValue: T {\n        get {\n            return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue\n        }\n        set {\n            UserDefaults.standard.set(newValue, forKey: key)\n        }\n    }\n}\n\n\/\/\/\u5c01\u88c5\u4e00\u4e2aUserDefault\u914d\u7f6e\u6587\u4ef6\nstruct UserDefaultsConfig {\n\/\/\/\u544a\u8bc9\u7f16\u8bd1\u5668 \u6211\u8981\u5305\u88f9\u7684\u662fhadShownGuideView\u8fd9\u4e2a\u503c\u3002\n\/\/\/\u5b9e\u9645\u5199\u6cd5\u5c31\u662f\u5728UserDefault\u5305\u88f9\u5668\u7684\u521d\u59cb\u5316\u65b9\u6cd5\u524d\u52a0\u4e86\u4e2a@\n\/\/\/ hadShownGuideView \u5c5e\u6027\u7684\u4e00\u4e9bkey\u548c\u9ed8\u8ba4\u503c\u5df2\u7ecf\u5728 UserDefault\u5305\u88f9\u5668\u7684\u6784\u9020\u65b9\u6cd5\u4e2d\u5b9e\u73b0\n  @UserDefault(\"had_shown_guide_view\", defaultValue: false)\n  static var hadShownGuideView: Bool\n}\n\n\/\/\/\u5177\u4f53\u7684\u4e1a\u52a1\u4ee3\u7801\u3002\nUserDefaultsConfig.hadShownGuideView = false\nprint(UserDefaultsConfig.hadShownGuideView) \/\/ false\nUserDefaultsConfig.hadShownGuideView = true\nprint(UserDefaultsConfig.hadShownGuideView) \/\/ true<\/pre>\n\n\n\n<p>\u6211\u628a@propertyWrapper \u7684\u5177\u4f53\u7528\u6cd5\u548c\u77e5\u8bc6\u70b9\u5df2\u7ecf\u5199\u5230\u4e86demo\u4e2d\u3002\u00a0<code>PlayGround<\/code>\u4e2d\u8dd1\u4e00\u8dd1\u5c31\u5f88\u7a33\u4e86\u3002<\/p>\n\n\n\n<p>\u5f53\u6dfb\u52a0\u65b0\u7684key\u53bb\u4fdd\u5b58\u6570\u636e\u7684\u65f6\u5019\u53ea\u7528\u5728UserDefaultsConfig \u4e2d\u6dfb\u52a0\u65b0\u7684\u5c5e\u6027\u548c\u5305\u88f9\u5668\u5c31\u884c<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">struct UserDefaultsConfig {\n@UserDefault(\"had_shown_guide_view\", defaultValue: false)\nstatic var hadShownGuideView: Bool\n\/\/\/\u4fdd\u5b58\u7528\u6237\u540d\u79f0\n@UserDefault(\"username\", defaultValue: \"unknown\")\nstatic var username: String\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4ec0\u4e48\u662f@propertyWrapper? \u4ece\u5b57\u9762\u610f\u601d\u53bb\u7406\u89e3 property Wrapper \u5c31\u662f\u5c5e\u6027\u5305\u88f9\u5668\u3002 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"_links":{"self":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/1582"}],"collection":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1582"}],"version-history":[{"count":3,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/1582\/revisions"}],"predecessor-version":[{"id":1586,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/1582\/revisions\/1586"}],"wp:attachment":[{"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1582"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1582"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1582"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}