読者です 読者をやめる 読者になる 読者になる

Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 983 - Arrayのメソッドjoined(separator:)

ちょっと気が緩むとブログの更新が途絶えてしまいそうです。毎日プログラミングに関して勉強、というか思考しているんですが、ブログに記録を残す作業が捗りません(T_T)

先日コメントして頂いたberrymuchさんにも返事ができていませんでしたm(_ _)m

少しずつ知識をつけています。皆さん、頑張りましょう... あれ頑張らなきゃいけないのは私か(^_^;)

// joined(separator:)

func joined<Separator>(separator: Separator) -> 
  JoinedSequence<Array<Element>> where Separator : Sequence, 
  Separator.Iterator.Element == Self.Iterator.Element.Iterator.Element 

こういうジェネリックな表現のメソッドの表現法にもだいぶ慣れました。このメソッドはArray型のSeparator(ジェネリック表現)がArrayで与えられます。つまり、Array型で与えられた場合、元(Self)のArrayのElementはArrayでないといけません。SeparatorのElementの型が、SelfのElement(Array)のElementの型と一致する条件のときだけ結合します。何のことやらよく分かりません。でも、例を挙げれば分かるでしょう。

let array = [[1, 2, 3], [23, 33, 45], [123, 456, 234]]
let joined = array.joined(separator: [0, 0])

// joined = [1, 2, 3, 0, 0, 23, 33, 45, 0, 0, 123, 456, 234]

こういうスタンダードライブラリを使えるようにならないといけませんね。

mapやreduceを説明したページに加えます。

yataiblue.hatenablog.com

Swiftで遊ぼう! - 982 - やっぱりプロトコール指向で躓いています。当然ですけど(-_-)

OOP(オブジェクト指向プログラミング)の真骨頂であるMVCパターンを理解するために必ず習得しなければならない概念がプロトコールとデリゲーションです。

しかし、時代は流れています。大きなプロジェクトに携わるとクラス継承を基本とした機能拡張では維持するのに多大な労力が必要になるそうです*1。また参照型のクラス利用では値の取り扱いにも注意が必要で見つけにくいバグとの戦いが想定されます。

そこで構造体(Struct型)やイーナム(Enum型)を中心にした値型を拡張するプログラミングスタイルが望まれ、それがプロトコール指向プログラミングです。プロトコールとデリゲーションによる拡張ではなくプロトコール(Protocol)とエクステンション(Extension)がベースになります。

ProtocolとExtensionを使った拡張性をPlaygroundで分かりやすく説明したページがありました。たぶんマストリードの内容です。内容も難しくないですよ。

www.raywenderlich.com

初心者の私はこの概念をどのようにOOP世界のiOSフレームワークに導入したらいいのかさっぱりわかりません。クラス体系で組み上げられているUIKitプロトコール指向を利用する方法がWWDC 2017で紹介されていました。

developer.apple.com

ここで紹介されているプロジェクトもダウンロードして眺めましたが、難しいです...

ファイルが細切れで何を拡張しているのか全体の見通しが悪いような気がします...

プロジェクトのメインテナンス性に優れているプロトコール指向ですが、Appleのデモプロジェクトは私のような初心者には大きすぎです。もう少しコンパクトなデモがあればいいんですけどね。

iOSを構成するMVCパターンはクラスで構成されているため「V」と「C」はそのままクラス利用が必要で、UIKitを必要としない「M」は構造体を中心にした「プロトコール&エクステンション」で拡張していくことが望まれます。また、「V」に関して、抽象的な描画に関してプロトコールに置き換えていくといいようです。

AppleもこれからiOSフレームワークプロトコール化を進めていくと思われるので、来月開催のWWDC 2018でプロトコール指向がどれだけ進化しているのか楽しみです。

私もプロトコール準拠のためにデリゲーションメソッドの実装を「Extension」に変更していこうと思います。

*1:まだ自分のアプリも作れないのに大きなプロジェクトの話などとうてい想像できませんけど

Swiftで遊ぼう! - 981 - Swift 4でreduceが便利になるっていうから勉強しました

そろそろWWDC 2017も間近に迫ってきているんで、Swift 4に関する情報も少しずつ出ているようです。

私は自分のブログ記事をSwift 3向けに改訂していたんですが、そろそろSwift 4向けに変更しないといけませんね。本当に時間が足りません(T_T)

それでも少しずつ理解力が上がっています。今まで歯が立たなかった専門家の記事も理解できるようになっているんです。

今日は次の記事を読んで感銘したので紹介します。

qiita.com

決して新しい記述法に感銘したんではなく初心者の私が感動した内容に関しては、次の記事の「reduce」の項目に加えたので読んでください。ポイントがずれてるけど私のような初心者はこういるところが勉強になるんです。

yataiblue.hatenablog.com

Swiftで遊ぼう! - 980 - 過去記事の修正

ググって調べている情報サイトの内容がかなり理解できるようになっています! 我ながら驚きです。地道に勉強を続けていた成果がやっと出てきているって感じですね。

トーリーボードの部品としてカスタムViewの作り方も理解できました!

xib」ってなんて読むのでしょう?

私は「エクシブ」って読みましたが調べていると「ジブ」って読むのが正解?

とりあえず以下の記事を少し修正しました。

yataiblue.hatenablog.com

今日はこれだけ。

Swiftで遊ぼう! - 979 - iOS開発関連サイト:リンク集

カスタムViewを用意するためにネットを色々調べていると有益なサイトが増えていることに気がつきました。私が勉強をはじめた頃はほとんど無かったんですが、iOS開発に興味をしめす人が多いってことですね。役に立ちそうなサイトを備忘録として記録します。

日本語サイト

プログラミング質問サイト

英語サイト

共有サイト

Swiftで遊ぼう! - 979 - UITextFieldのプロパティ: inputView

オリジナルアプリ作りに奮闘中!

誕生日データを入力するためにオリジナルのポップオーバーを使ったら便利だと思って実装しました。

f:id:yataiblue:20170502181940j:plain

ところが読者のberrymuchさんから「iOSヒューマンインターフェイスガイドライン」に準拠していないという指摘をうけました(T_T)

どうせ作るならAppStoreで受け入れられるアプリを作りたいのでガイドラインに準拠させていくことにします。

ユーザーからの入力は基本、キーボードを使用するようになっています。するとシステムで用意されていないキーボードを使用したい場合、カスタムキーボードを用意しなきゃいけないのかなって最初は思いました。

しばらくググって調べてみると、UITextFieldの場合、標準キーボードの代わりにUIViewクラスの「inputView」が利用できることがわかりました。それに加え「inputAccessoryView」を使えばUIToolbarも実装できます。iPhoneiPadのどちらでも同じように使用できるんで、ポップオーバーの実装をそのままinputViewに変更しました。

f:id:yataiblue:20170518174058j:plain

しかし、1つだけ問題があります。iPadではiPhoneで存在しない謎のメニューがUIToolbarとUIDatePickerの間に出現します。

f:id:yataiblue:20170518175035j:plain

これをどうやったら隠すことができるんでしょうか?

とりあえず見た目は同じにできましたがまだ実装が追いついていません。というのもinputViewのデザインをすべてコードでしないといけないんで、NumpadViewの実装も大変なんです。

たぶん、ストーリーボードを使ってデザインできると思うので、もう少しInterface Builderの使い方も勉強した方がよさそうですね...

Swiftで遊ぼう! - 978 - 今頃ですがWWDC 2016のビデオ観てます(^_^;)

来月はWWDC 2017が開催される予定です。

新しいiPad Proの発売の噂もあるんで楽しみにしていまが、またiOSフレームワークやSwiftに変化が加わるんでついていくのが大変です。復習という訳じゃなく、アプリのデザインの関連する項目をWWDC 2016のビデオから選択して観ています。

iPad向けのアプリを作っているんですが、iPhoneにも対応できているのが基本のようなので「Making Apps Adaptive, Part 1」で勉強しました。

developer.apple.com

今日のビデオのポイントは次のメソッドです。

traitCollectionDidChange(:)

しかしながら、Xcode 8のInterface Builderを使っているかぎり、このコードを意識する必要がないんです。すべて自動で設定してくれるんです。

The system is going to do most of the work so you don't have to.

ということで、Xcode 8のサイズクラスの使い方をブラッシュアップしました。

これだけ。