Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 987 - 復活を宣言!

「Swiftで遊ぼう!」読者の皆さん、お久しぶりです。

万年プログラミング初心者親父がはてなに戻って参りました(^_^;) ブログの中断に併せて勉強も中断してました。約2年間は毎日できる限りSwiftプログラミングに触れていたんですが、ここ数ヶ月は完全に離れてしまったのでオリジナルアプリ開発の目的が遠ざかったような気がします(T_T)

OOPの概念を理解できたんで後はAPIの利用とオリジナルアプリのアイディアを実体化するところだったのですが... 現役を離れると知識の後退も速いですね(^_^;)

Swift 4が公開され、また言語的なブラシュアップが必要になりました。

それでもAppleが用意しているドキュメントもかなり豊富になっているのでドキュメント・ライブラリを読み返すところから始めます。

まずはフレームワークの1つ「UIKit」のドキュメントから読みます。

Important
Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.

UIKit | Apple Developer Documentation

という記述も理解できます。まあ完全初心者から脱却はできてるようです。

ちょっとずつ毎日ブラシュアップ開始です。

Swiftで遊ぼう! - 986 - WWDC 2017 デザイン

WWDC2017のビデオを見ています。

オリジナルアプリも作っているのでアプリケーションのデザインに関するビデオも見ました。

developer.apple.com

developer.apple.com

developer.apple.com

とりあえずデザイン関係3本見ましたが,面白いですね。

今日はこれだけ。

Swiftで遊ぼう! - 986 - Swift 4からJSONの扱いが超簡単!

WWDC2017のセッションビデオは面白いです!Xcode 9βをダウンロードして遊んでいます。もうXcode 8に戻る気持ちが無くなっています...

Foundation周りでKeyPathとJSONの扱いに大きな変更があります。

developer.apple.com

KeyPathも扱い易くなったので、既存のKVOでもで試してみたくてもまだ実装されていない機能がありチュートリアルを変更できません。

ということでJSONチュートリアルを変更しました。自動化がかなり進んでいるので、Swift 3向けのチュートリアルからコードがかなり抜けてシンプルになりました。初心者にも分かりやすい変更で嬉しいですね。

次のチュートリアルをSwift 4向けに変更しました。

yataiblue.hatenablog.com

Swiftで遊ぼう! - 985 - Swift 4から「private」の扱いが少し緩くなりました。

WWDC 2017のビデオ見てます。

Swift 4向けに自分の記事を少し変更しました。

アクセスコントロールの内容をSwift 4に向けて改訂しました。

yataiblue.hatenablog.com

新しい開発環境を勉強するって楽しいですね。

では。

Swiftで遊ぼう! - 984 - Xcode 9のリファクタリング機能は超絶!

WWDC 2017が開催中です。オリジナルアプリを作っていたのですが完全にストップしてます。暇があれば新しい開発環境の説明を見ています。

Platforms State of the Union - WWDC 2017 - Videos - Apple Developer

リファクタリング」って言葉も知らなかったです(^_^;) Xcode 8までの「ソースエディタ」が「ソースエディタ with リファクタリング」として超便利になりました!

「コマンドキー」を押しながらカーソルを動かすとコードブロックが明示的で分かりやすいし、プロトコールをクリックすれば、準拠すべき必須メソッドは自動的に組み込まれたり、コードブロックを自動的に外部メソッドに書き出せます。このときメソッド名は自動的に「extractedFunc」になりますが、強力な「リネーム・リファクタリング」機能があります。

このリネーム・リファクタリング機能は、初心者の味方ですね。適当につけたメソッドの名前を逃さず変更できるんです。この機能は超絶です!

私はもう今日からXcode 9のベータ版を使ってiOS 11向けの開発だけに集中します。当然Swift 4に変更です。

皆さん、もうSwift 3向けへの改訂作業を中止して Swift 4向けに変更です。しばらく画像は公開できないので古いイメージを使います。

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:まだ自分のアプリも作れないのに大きなプロジェクトの話などとうてい想像できませんけど