↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > Typealiasをどうやって活用するのか

Typealiasをどうやって活用するのか

サンプル画像

Typealiasって言葉、なんだややこしく見て見ないふりをしていましたが、 先日別の記事を書いた際にTypealiasの記述がありましたので、あらためて確認してみようと思います。まずaliasですが、 Macでショートカットを作成した時に記載される「エイリアス」です。ショートカットのようなものですので、 Typeのショートカット的な感覚で調査進めてまいります。

参考:堅牢で使いやすいAPIクライアントをSwiftで実装したい
参考:Type Aliases — http://SwiftDoc.org
参考:Swift typealias to the rescue — Swift Programming — Medium
参考:Life-LOG OtherSide:Swiftで遊ぼう! - 37 typealiasを考える

参考URLをざっと読んでいると既に混乱してきました。クラス内の関数の返り値や引数なんかに 汎用的に利用すればよいのかな?いろいろ使い方がありそうですので、ひとつずつやってみます。

やってみた

まず、普通にViewController.swiftにtypealiasを記載できるのか?をやってみます。

こんなサンプルがあったので利用します


typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min

が、、、、、うーん、例がなんともわかりずらいので、Swiftサラリーマンの名称で。よく使うStringをaliasに設定してみます


typealias SwiftSalaryman = String

SwiftSalarymanをString型として利用する。できるのかな

サンプル画像

すると、、、、型宣言の箇所でSwiftSalarymanが使えるように!これはなんだか面白いですね。 長いクラス名だったり頻繁に利用するものは短くしたりできるのでしょうか


関数の引数でAliasを利用する方法も検証してみます。

それでは関数の引数にTypeAliasの有無のコードを比較してみます。(可読性が上がります)

無い時


class FacebookSwiftSalarymanPage {
    func getUsers(
        success: ((result: AnyObject, operation: String) -> Void),
        error: ((error: NSError, operation: String) -> Bool),
        finished: (() -> Void)) {
            //処理
    }
    func getUser(user: String,
        success: ((result: AnyObject, operation: String) -> Void),
        error: ((error: NSError, operation: String) -> Bool),
        finished: (() -> Void)) {
            //処理
    }
}

↑上は通常。Aliasを使わなかった場合。

ある時


class FacebookSwiftSalarymanPage {
    typealias SuccessHandler = (result: AnyObject, operation: String) -> Void
    typealias ErrorHandler = (error: NSError, operation: String)-> Void
    typealias FinishedHandler = ()-> Void
    func getUsers(
        success: (SuccessHandler),
        error: (ErrorHandler),
        finished: (FinishedHandler)) {
            //処理
    }
    func getUser(user: String,
        success: (SuccessHandler),
        error: (ErrorHandler),
        finished: (FinishedHandler)) {
            //処理
    }
}

↑上はAliasを使った場合。わざわざsuccessの箇所を理解しなくて良いので 可読性上がったのではないでしょうか。Aliasは関数も割り当てられるようです


ProtocalにTypeAliasが使われている場合。

参考:堅牢で使いやすいAPIクライアントをSwiftで実装したい

またよくわからないプロトコルを定義してみました


protocol SwiftSalaryman {
    var name: String { get }
    var age: String { get }
    typealias Response: Any
    func getHige(index: Int) -> Response?
}

例えば上記のようなプロトコルがあり、 Typealisaで関数戻り値用の型「Response」にAnyを関連づけした(なんでもOK型)をgetHige関数の戻り値にセット。( どんなヒゲオブジェクトが戻ってくるか不明な関数)。


class Oyagi001: SwiftSalaryman{
    let name = "sisheli";
    let age = "34";
    typealias Response = String
    func getHige(index: Int) -> Response? {
        var ret:String = "";
        return ret;
    }
}

上記のキモなのはResponseにどんな型でもいれられるなのではないでしょうか。上はString型なので ピンとしませんが、どんな型をセットすることもできるのであればProtocolとして汎用的に利用できるのかと思います。

サンプル画像

まとめ

さてTypeAliasの嫌〜〜〜な感じ、、、私は少しは減った気がしました。何かお役に立てていれば幸いです。一人で小さいアプリをコツコツつくっているので Protocolとか使う機会ないので大きなプロジェクトしてみたいです。

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!