<div class="chatlog__message-group"> <div id="chatlog__message-container-754924344177590404" class="chatlog__message-container" data-message-id="754924344177590404"> <div class="chatlog__message"> <div class="chatlog__message-aside"><img class="chatlog__avatar" src="https://cdn.discordapp.com/avatars/391777793861615647/31a6a0dfa55f845d5f1c6c43c681d40d.png?size=512" alt="Avatar" loading="lazy"></div> <div class="chatlog__message-primary"> <div class="chatlog__header"><span class="chatlog__author" title="takka." data-user-id="391777793861615647">takka</span> <a href="/channels/430242233468452865?category=main&channel=swiftbot-sandbox&message_id=754924344177590404"><span class="chatlog__timestamp" title="Monday, September 14, 2020 4:39 AM"></span></a><a href="#chatlog__message-container-754924344177590404">9/14/2020 4:39 AM</a></div> <div class="chatlog__content chatlog__markdown"><span class="chatlog__markdown-preserve"><span class="chatlog__markdown-mention" title="swift52#7242">@swift-5.2.5</span> <code class="chatlog__markdown-pre chatlog__markdown-pre--multiline language-swift">import Foundation @propertyWrapper struct DefaultValue<Storage: DefaultValueStorage>: Decodable { var wrappedValue: Storage.Value = Storage.value } extension DefaultValue { init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() self.wrappedValue = try container.decode(Storage.Value.self) } } protocol DefaultValueStorage { associatedtype Value: Decodable static var value: Value { get } } enum DefaultValueStorages { enum Nil<T: Decodable>: DefaultValueStorage { static var value: T? { nil } } } // MARK: - 1. 直接書く struct S1 { @DefaultValue<DefaultValueStorages.Nil<String>> var string } // MARK: - 2. 別enumでtypealiasする enum Default { typealias Nil<T: Decodable> = DefaultValue<DefaultValueStorages.Nil<T>> } struct S2 { @Default.Nil<String> var string } // MARK: - 3. extension DefaultValueでtypealiasする extension DefaultValue { typealias Nil<T: Decodable> = DefaultValue<DefaultValueStorages.Nil<T>> } struct S3 { @DefaultValue.Nil<String> var string }</code></span></div> </div> </div> </div> </div>