1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SwiftAdvent Calendar 2021

Day 17

Swift Type Alias から学ぶ開発指針と雑学

Last updated at Posted at 2021-12-16

はじめに

iOS15 対応時に遭遇したとあるライブラリに対する 技術的対応方法 と、そこから学べる 雑学 をご紹介します。
Advent Calendar も後半に突入しましたので、気分転換として読んでいただければと思います。

iOS15 対応

とあるプロジェクトで BonMot という Swift 製ライブラリを利用していました。
BonMot は文字の装飾をサポートするライブラリで Foundation.NSAttributedString を拡張して作られています。

結論、この BonMot 内のオブジェクト名と同様のオブジェクトが Foundation にも iOS15 から定義されることになったのです。それが StringStyle です。このように Framework 間で名前の衝突 が発生した場合、Foundation が優先されるようで、iOS15 対応時にビルドエラーが発生するようになりました。

typealias StringStyle = BonMot.StringStyle

対応方法は README にも記載がありますが、上記のように typealias を利用して参照先を変更 するというものになります。次にこの対応の詳細をまとめます。

Type Alias

public let stringStyle: BonMot.StringStyle

まず、typealias を利用せずに対応する場合は上記のようになります。StringStyle を参照する所全てに BonMot. を加えていく必要があります。 そんな時に便利なのが typealias なのです。

final class ViewController: UIViewController {
    typealias StringStyle = BonMot.StringStyle // Type Alias

    public let stringStyle: StringStyle // This
    init() {
        stringStyle = StringStyle( // This
            .color(.red),
            .font(.systemFont(ofSize: 14)),
            .minimumLineHeight(24)
        )
    }
}

次に、typealias を利用すると上記のようになります。typealias を定義したネームスペース内であれば Foundation.StringStyle ではなく BonMot.StringStyle を参照するようになります。
では、これを 全てのクラスに対して適応 したい場合はどうしたら良いでしょうか。

public extension NSObject {
    typealias StringStyle = BonMot.StringStyle
}

かなり大胆なことをしていますが、上記のようにすることで今回の事例に対しては対処が可能です(厳密には「全てのクラスに対応」を実現できていません)。
ただ、ここまでして BonMot を継続していく必要はあるのでしょうか。

開発方針の見直し

  • サードパーティ製フレームワークの利用理由
  • 新しい API への置換
  • 暫定対応であると明記

サードパーティ製フレームワークの利用理由

OS のアップグレードは1年に一度だけの ビッグイベント です。この機会を最大限に生かさない手はありません。
外部依存は苦戦しがちだからこそ、このタイミングでその ライブラリを利用している理由を明確に しておくと良いかもしれません。当時は UIKit ベースであることによって発生する問題解決のために導入したライブラリで、SwiftUI への移行で解決してしまう、なんてこともあるかもしれません。

新しい API への置換

Apple が提供する公式 API も年々進化を続けています。Cocoa に限らず、Swift に関してはサードパーティだった機能が次々取り込まれています。ですから、今後の メンテナンスコストが増大する前に 、新しい API への移行を優先度高く進めるべきかもしれません。

暫定対応であると明記

とは言ったものの、対応に時間がかかる、サポートバージョンの関係で完全に切り離せないなどの事象は発生しがちです。そんな時は、 一時的対応であることを明記して暫定対応 を行いましょう。TODO: とコードにコメントを残してワーニングを出力するなど、 目立たせることそれに慣れない環境づくり がポイントです。

NSObject

さて、改めて NSObject とは何でしょうか。
ルートオブジェクトであることはご存知かと思いますが、「NS」の語源に関して知っている iOS エンジニアの割合は年々低くなっているのではないでしょうか。答えですが、NeXTSTEPの略だと言われています。こういったところから Apple の歴史を振り返る のも良いかもしれませんね。

さいごに

最後まで読んでいただき、ありがとうございます。
ご指摘、ご感想などありましたら気軽にコメントください!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?