【Swift】Swift5.1からOptionalのEnumのswitch文をより簡単にかけるようになった

はじめに

Swift5.0まで OptionalEnumインスタンスに対してswitch文を使用する際は下記のように.some(T).noneで記述する必要がありました。

enum Frequency {
    case daily
    case weekly
    case monthly
    case yearly
}

let frequency: Frequency? = .daily
switch frequency {
case .some(.daily): print("daily")
case .some(.weekly): print("weekly")
case .some(.monthly): print("monthly")
case .some(.yearly): print("yearly")
case .none: print("nil")
}

これは Swift では Optional が下記のような enumで表現されていることに起因します。

enum Optional<T> {
    case some(T)
    case none
}

このswitch文での分岐に関してSwift5.1で変更があったため記載します。

環境設定

以下の環境を使用しています。

  • Swift5.1

内容

Swift 5.1から Optionalenumのプロパティをswitch文で分岐させる際に、 .some(T) のように記載する必要がなくなりました。 具体的には「はじめに」に記載したコードをSwift5.1では下記のように記述することができます。

enum Frequency {
    case daily
    case weekly
    case monthly
    case yearly
}

let frequency: Frequency? = .daily
switch frequency {
case .daily: print("daily")
case .weekly: print("weekly")
case .monthly: print("monthly")
case .yearly: print("yearly")
case .none: print("nil")
}

まとめ

細かな変更ですが .someの記載が不要になったことで . を打つだけで分岐先の候補が一覧で補完されるようになり、書き味がより良くなったと思います。

2019年11月振り返り

11月の振り返り

目標の進捗状況の定期確認です。12月に入り、寒さがより本格化してきました。 僕はと言えば去年まで着れていた服がキツキツになり、とても苦しい日々を送っています。 きつすぎて腕が上がりません、通勤中につり革につかまる動作をする際に両手を上げないと腕が上がらない。 座る際に肩がパンパンに張ってすごく痛い。そんな感じです。

ここ数年ユニクロで破れたシャツを補充するみたいな服の買い方しかしていませんでしたが、そろそろ本腰を入れなければならないようです。ただ、また来年着れなくなるのではないか、という懸念でモヤモヤしています。

体の基礎づくり

デッドリフト120kgに挑戦したところなんとか持ち上がりました。血管が切れそうになりました。 120kgで 5 rep * 5set を安定してできるようにここから頑張っていきたいです。

アウトプット

ブログ投稿

  • 目標: 100記事 /年 -> 70記事 / 年 -> 50記事/年
  • 実績: 今月 - 本記事も合わせて5記事 / 通年 - 48記事

残り2記事で目標達成です。12月があるためこの目標は達成できそうです。下方修正していますが。  

登壇

  • 目標: 6件 / 年 -> 3件 / 年 
  • 実績: 今月 - 1件 / 通年 - 全2件

2019/11/29に株式会社ゆめみ様主催のYUMEMI.swift 第5回にて、「Swift 5.1の変更点」というタイトルで発表いたしました。 当日は興味深い発表が多く、懇親会も大変楽しむことができました。運営のみなさま、参加者のみなさまありがとうございました、この場を借りてお礼申し上げます。

yumemi.connpass.com

発表資料は下記です。

speakerdeck.com

サービス開発(アプリに限定しない )

  • 目標: 3件
  • 実績: 今月 - 0件 / 通年 - 1件

特に進捗なしです。

スキルアップ

AtCoder

  • 目標: 水色
  • 実績: 茶色

動けていません。

LeetCode

  • 目標 50問 -> 25問
  • 実績 今月 - 6問 / 通年 - 10問

StackとHeap木に関して重点的に学びました。 特に Heap木に関しては単純な順列と等価な非常に簡単なデータ構造でありながら、最大・最小値を得るためのデータ構造としては大変使い勝手の良いものであることがわかり興味深かったです。Swiftでの実際の実装は下記が大変参考になりました。 大変面白いのでお時間ある方は是非ご一読ください。

github.com

Git

  • 目標: 500 commit / 年
  • 実績: 10 commit / 月
  • 実績: 253 commit / 年

こちらはあまり進捗を出せませんでした。

その他

活動

読了

読書開始

読書中

それなりに本を読み進めることができました。今月読み終わった本はどれも大変面白かったです。 Clean Architectureはもちろんですが、エンジニアとして ~ は海外のテック企業で働くためにはどうすれば良いか具体的なイメージを持つこちができ、一歩踏み出すきっかけを得ることができるような内容でした。他はお金に関連した本ですが、こちらも大変面白いです。 12月は新しい本はあまり増やさず、読書中の本を集中して進めて行けたらと考えています。

いよいよ今年も残り1年です。悔いの残らぬよう最後まで全力を尽くします。

Designship 2019 に参加しました

はじめに

Designshipはデザイナー向けの国内最大級のカンファレンスです。東京国際フォーラムで11/23-24にかけて開催されました。そちらに参加してきましたので、感想等記載します。なお、1日目は体調を崩し参加できなかったため、後日アーカイブを確認の上、追記します。

Emptiness と Simplicityについて

原研哉氏の発表、「日本について」で触れられていた概念です。日本の文化は一見西洋のシンプルと似通っているように見えますが、実際はEmptinessの概念であり、別のものであると説明されていました。

Emptinessはそこに何もないことが、そこに何かが来る可能性があること、ないことが意味を持つというような説明がされていたと思います。一例として、四方を区切った空間を代といい、その空間はEmptyであるため、神が宿り得る、その上に屋をおき、屋代としたという話はとても印象的でした。

日本の文化に対する深い理解に裏打ちされたとても素敵な発表でした。氏の著作である「白」という本にも興味を持ちましたので時間を見つけて読んで見たいと思います。こちらの発表だけでも参加したかいがあったそう思えるセッションでした。

白

弱みが強みになりえる

いくつかの発表の中でたびたび出てきていたように思います。例えば、 「自身の弱みを武器にしたソーシャルイノベーション」を発表された福岡さんは自身の吃音と向き合い、今はその問題に携わるような仕事をされています。また、「なるほどデザイン」の筒井さんは書籍の執筆内容が苦手だったからこそ、どのように対処すれば良いかを考え続けた結果、書籍にまとめられるまで言語化できたという話がありました。

ともすれば苦手な分野は敬遠しがちですが、苦手と感じるということは何となくできる状態とはことなり、意識して課題点と向き合わなければそのことはできません。それは見方によっては、課題点を言語化し他の人に共有しうる貴重な資質になりえるのだなと理解しました。

NEEDではなくWANTでキャリアを考える

どちらのセッションで話されていたのか記憶が曖昧になってしまいましたが、独自のキャリアを築くことを考える際に、マーケットに求められているNEEDではなく、自身が真に何がやりたいか、WANTによるといいと行った話がありました(勘違いかもしれませんが)。

ともすれば、私は市場評価を気にしてキャリアを選びがちな傾向がありますが、判断に困る選択肢が上がった際の最後の要素として参考にしたいと考えています。ボブ・ディランも心にしたがえば最後はきっとうまくいくといっていた気がします。(これも勘違いかもしれませんが)

総じて

今回のカンファレンスは「あなたのことを話してください」という裏テーマがあったようです。そのため、各発表はデザイナーの方々の発表ではありますが、キャリア感、どのようなことを考えて仕事をしているのか等エンジニアの私にとっても大変参考になる発表でした。

そろそろキャリアの方向性をしっかり決めていかなければならない年齢になったこともあり、身に染みる話が多かったです。本稿は勢いで書いたのであとで1日目のアーカイブを見た後に加筆修正できればと思います。アーカイブ動画が楽しみです。来年も開催されるなら是非参加したいなと思っています。

【Swift】StructやClassスコープからSelfでstatic memberへのアクセスが可能になった

はじめに

Swiftではstructやenumおよびclass内からstaticなメンバーにアクセスする際には以下のようにClass名.staticMemberかtype(of: self).staticMemberとする方法がありました。

struct Sample  {
    static var hoge: Int = 0
    
    func sampleFunction() {
        // クラス名.staticMember
        let a = Sample.hoge
        // type(of: self).staticMember
        let b = type(of: self).hoge
    }
}

Swift5.1でこちらのアクセス方法に変更があったため記載します。

環境設定

以下の環境を使用しています。

  • Swift5.1

内容

structやclass, enum内のスコープにおいて、 Self.staticMemberでstaticなプロパティやメソッドにアクセスできるようになりました。 具体的には下記のようになります。

struct Sample {
    static var hoge: Int = 0
    static func fuga() {}
    
    func sampleMethod() {
        // こちらは従来からできました
        let sampleA = Sample.hoge
        let sampleB = type(of: self).hoge

        // swift5.1からこのアクセス方法が可能になっています
        let sampleC = Self.hoge
        
        Sample.fuga()
        type(of: self).fuga()

        // メソッドにも同様にアクセス可能です
        Self.fuga()
    }
}

class ClassSample {
    static var hoge: Int = 0
    class func fuga() {}
    
    func sampleMethod() {
        // classでも同様にアクセス可能です
        let sampleA = Self.hoge
        Self.fuga()
    }
}

まとめ

プロポーザルにも記載がありますが、 インスタンスのselfに対応する形でメソッドやプロパティにアクセスすることができ、理解しやすくなったのではないかなと感じています。参考に元のプロポーザルへのリンクを記載していますので是非ご確認ください。

参考

【iOS】iOS13でSystemフォントがTimes New Romanフォントに変更されることがある

概要

タイトル通りです。バグレポートでも上がっているようにUITextViewなどでsystemフォントを指定していた際に、アプリ実行時にTimes New Romanフォントに変更されてしまう、という事象が発生しているようです。

NSAttributedStringKey の .fontに明示的にUIFontを指定しないと起きるのではないか等原因に関して言及されていますが、はっきりとした理由はわからないと言うのが正直なところではないでしょうか。

事象と対応

私の場合ですが、Interface Builder上でUITextViewのplainの文字列にsystemフォントを設定していたところ、アプリ実行時に該当のエラーが発生しました。下記のようにコードから明示的にUIFontを指定することでバグを回避できています。

textView.font = UIFont.systemFont(ofSize: 16.0)

参考にネット上で見つけた関連した文書をまとめていますのでご参照ください。

所感

iOS 13 は本事象だけでなく様々なバグが発生しており、なかなか苦しいなというのが正直な感想です。。 アプリ内で文字フォントがおかしくなっていないか、念のため確認した方が良いかもしれません。

参考

【iOS】Password Autofillの実装

はじめに

iOS11からpassword autofillに対応することが可能になりました。 具体的には、パスワード新規作成時にiOSから提案される強力なパスワードを使用したり、keychainにユーザーID、パスワードのセットを記録し、アプリ使用時やWebサイトのログイン時に記録されたID・パスワードを使用することができます。

具体的な実装としては、下記のように対応することになります。

  • Apple Developer CenterにてAssociated Domainsにチェック
  • アプリのProject設定を変更
  • サーバーにapple-app-site-associationを配置
  • アプリ側のTextFieldのTypeに適切な値を設定する

本記事にて対応の概要と対応する中で学んだ注意点や補足事項を記載します。

環境設定

以下の環境を使用しています。

  • iOS 13.1.2
  • Xcode11.1.0

対応方法

以下で「はじめに」に記載した対応手順を概説します。

Apple Developer CenterにてAssociated Domainsにチェック

Apple Developer Center > Identifiersから自身のアプリを選択し、Associated Domainsにチェックをつける必要があります。この際にCapabilitiesの追加を行なったことによりProvisioning ProfileがInvalidateされますので、再作成を忘れないようにしてください。 f:id:Iganin:20191106201616p:plain

アプリのProject設定変更

アプリのProject設定を変更します。 Signing & Categoriesから「+Capability」ボタンを押下し、Associated Domainsを選択します。この際に、まだProjectにentitlementsファイルがない場合は新規生成されますので、適当なフォルダに格納したり、命名の変更を行なってください。 f:id:Iganin:20191106204028p:plain

検証環境と本番環境のConfigurationを別々にしているのが一般的かと思いますので、Build Settingsから各Configurationにあったentitlementsを設定するのが良いかと思います。

f:id:Iganin:20191106204311p:plain

associated domainsに追加したいdomainを記載します。webcredentials:<domain名>かユニバーサルリンクの対応を行いたい場合はapplinks:<doamain名>とすれば良いでしょう。なお、associated domainsは各entitlementsに対して設定できますので、検証環境と本番環境を分けることが可能です。

f:id:Iganin:20191107015327p:plain

サーバーにapple-app-site-associationを配置

アプリのprojectにて設定したドメインのサーバーにapple-app-site-associationファイルを追加します。ドメイン直下か.well-known配下に格納するようドキュメントには記載されています。例えば、ドメイン直下に格納した場合はhttps:///apple-app-site-associationでアクセスできるか確認します。(※ .well-known配下に格納した場合はhttps:///.well-known/apple-app-site-association)

実際のファイルの中身は下記のようになります。あまり情報はありませんでしたが、webcredentialsとapplinksの双方を記述して問題なさそうでした。ファイル自体はJSON形式で詳しい内容はAppleの公式ドキュメントに記載されています。

{
    "webcredentials": {
        "apps": [ "${TeamID}.${BundleID}" ]
    },
    "applinks": {
        "apps": [],
        "details": [{
            "appID": "${TeamID}.${BundleID}",
            "paths": ["*"]
            }]
    }
}

アプリ側のTextFieldのTypeに適切な値を設定する

ユーザー名、パスワードを入力するTextFieldに適切な値を設定します。Username, New Passwordの組み合わせで強力なパスワードの自動生成、 Username, Passwordの組み合わせでユーザー名, パスワードの自動入力が使用できます。同一画面上にUsernameがなく、password関連の入力のみの場合は上記は機能しないようでした。また、One Time Passwordに設定することでSMSに届いたOne Time Passwordを自動で入力値の候補として使用するようにできます。このあたりの内容の詳細は公式ドキュメントを参照ください。

以上の設定でPassword Autofillの機能追加が完了します。ただ、検証する中で引っ掛かった点がありましたので、いかに補足として記載します。

補足

上記設定をしてもPassword Autofillが機能しない場合のiPhone側確認事項

Password Autofillですが、保存先としてiCloud Keychainを使用しています。 そのため、有効化するためには以下の設定が必要です。

  • Apple Accountでログインする
  • 設定アプリ > Apple ID > iCloud > キーチェーン が オンになっている

Face IDやTouch IDの認証が求められた際の挙動

QuickType barからユーザーID・パスワードを選択した際に、Face IDかTouch IDの入力を求められます。 この際に、Face IDかTouch IDが表示された際にapplicationWillResignActive(_:)が呼ばれ、入力が完了した際にapplicationDidBecomeActive(_:)が呼ばれます。したがって、該当メソッド内で画面遷移などを実装している場合、意図しない挙動となる可能性が高いため注意が必要です。

Associated Domainsが登録されるタイミング

公式ドキュメントによると、アプリがiOSバイスにインストールされたタイミングでentitlementファイルのassociated domainsに登録されているドメインからassociationファイルをダウンロードし、アプリのIdentifierが登録されているか確認し、登録を行うようです。

この際にサーバーから500-599のエラーが返却された際はデフォルトでは3時間おきに8回まで通信リトライをするとのことです。

ドメインの関連付けに成功した後はアプリがデバイスから削除されるまでは関連付けは維持され続けるようです。サーバー側のassociationファイルの修正の反映を即座に確認したい場合はアプリの削除をすることが推奨されていました。 この辺りの詳細は* 公式ドキュメント - About the Password AutoFill Workflow を参照ください。

参考

以下参考文献です。公式のドキュメントから関連した文書を集めました。 やはりまずは一次情報に一通り当たるのが理解の近道かと思います。

2019年10月振り返り

10月の振り返り

目標の進捗状況の定期確認です。今月に入ってめっきり寒くなり、体調を崩し気味でした。11月は元気に過ごしたいです。 プライベートでは友人に触発され第7世代iPadを購入しました。Kindleでは少々読みづらいためあまり進められていなかったKindleで購入した各種技術書をこれを機に進められればと考えています。  

体の基礎づくり

特に変わらずです。週に1回のペースで通っています。

アウトプット

ブログ投稿

  • 目標: 100記事 /年 -> 70記事 / 年 -> 50記事/年
  • 実績: 今月 - 本記事も合わせて4記事 / 通年 - 43記事

残り2ヶ月で27記事です。 少々現実的ではないため、50記事まで目標を下方修正しました。  

登壇

  • 目標: 6件 / 年 -> 3件 / 年 
  • 実績: 今月 - 登壇なし / 通年 - 全1件

特に活動できていません。

サービス開発(アプリに限定しない )

  • 目標: 3件
  • 実績: 今月 - 0件 / 通年 - 1件

特に進捗なしです。

スキルアップ

AtCoder

  • 目標: 水色
  • 実績: 茶色

動けていません。

LeetCode

  • 目標 50問 -> 25問
  • 実績 今月 - 3問 / 通年 - 4問

少し進めました。C++がなかなか覚えられません。。

Git

  • 目標: 500 commit / 年
  • 実績: 5 commit / 月
  • 実績: 243 commit / 年

ダメダメです。。。

その他

活動

  • b.tokyo 2019に参加しました。
  • sansan builders boxに参加しました。
  • Rust.Tokyoに参加しました。

読了

  • 三体

読書開始

  • 投資される経営・売買される経営
  • 会計の世界史
  • Ruby on Rails 6 エンジニア養成読本
  • Clean Architecture 達人に学ぶソフトウェアの構造と設計

読書中

  • CAREER SKILLS
  • エンジニアとして世界の最前線で働く選択肢
  • 紙の動物園
  • レガシーコードからの脱却
  • はじめてのUIデザイン
  • データ志向アプリケーションデザイン

映画

並行して読んでいる本がオーバーフローしてきました。11月中に5冊は読み切りたいところです。 11月はプロダクトマネージャーカンファレンスとDesign Shipがあります。自身の専門性であるiOSアプリ開発のスキルを伸ばしながら、サービス全体をよくするためにはどうするかという視点も持てるよう引き続き周辺分野の学習も続けていきたいです。

それはさておき、プライベートがインプットに片寄り出しているのでアウトプットをもっと行なった方が良いかもしれません。11月はその辺りに課題感を持ちながら、1日1日進められたらと考えています。