iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Swift】optional プレフィックスについて

先日、下記の記事を見て 「optional プレフィックスってそうゆう役割だったのか!」ということを知ったので、メモしておきます✍️

qiita.com

ということで、まずは 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.

ということで、基本にoptionalProtocolで使用することが可能で、下記のようにClassoptionalなプロパティを宣言しようとするとエラーが発生します。

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プロトコルは、クラスでのみ採用できるのでStructEnumでは使用できないみたいですね👀

@objc protocol HogeInterface {
    @objc optional var hoge: String { get set }
}

struct Hoge: HogeInterface { // Non-class type 'Hoge' cannot conform to class protocol 'HogeInterface'
}

てな感じで本日も以上になります🍺

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com