【Swift】optional プレフィックスについて
先日、下記の記事を見て 「optional
プレフィックスってそうゆう役割だったのか!」ということを知ったので、メモしておきます✍️
ということで、まずは Swift
のドキュメントを見てみます。
You can define optional requirements for protocols. These requirements don’t have to be implemented by types that conform to the protocol. Optional requirements are prefixed by the optional modifier as part of the protocol’s definition.
ということで、基本にoptional
はProtocol
で使用することが可能で、下記のようにClass
でoptional
なプロパティを宣言しようとするとエラーが発生します。
class Hoge { optional var hoge: String // 'optional' can only be applied to protocol members init(hoge: String) { self.hoge = hoge } }
Optional requirements are available so that you can write code that interoperates with Objective-C. Both the protocol and the optional requirement must be marked with the @objc attribute.
また、optional
で宣言する場合にはObjective-C
と相互運用するコードに記述する必要があるらしく、@objc
修飾子をつけなければ下記のようなエラーが発生します。
protocol HogeInterface { optional var hoge: String { get set } // 'optional' can only be applied to members of an @objc protocol }
ちなみに@objc
プロトコルは、クラスでのみ採用できるのでStruct
やEnum
では使用できないみたいですね👀
@objc protocol HogeInterface { @objc optional var hoge: String { get set } } struct Hoge: HogeInterface { // Non-class type 'Hoge' cannot conform to class protocol 'HogeInterface' }
てな感じで本日も以上になります🍺