Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 997 - 以前の乱数のページを改訂しました。

今日は下記のページの乱数に関する記述をSwift 4.2向けに改訂しました。

Swiftで遊ぼう! - 720 - もう少しランダム数を考える - Swiftで遊ぼう! on Hatena

ちょっとずつ既存の話題を最新のSwift 4.2に切り替えていきます。

Swiftで遊ぼう! - 997 - Swift 4.2で乱数の扱いが変わりました!

WWDC2018の「What's New in Swift」をみていて乱数の扱いが変わったことを知りました。

乱数の発生ひとつとっても、初心者だった私はC言語APIから利用されていた「arc4random()」に違和感を感じていたし、AppleもこのC言語APIの利用はプラットフォームにより挙動が異なる欠点があったということで見直したようです。

let randomInt = Int.random(in: 1...100)
print(randomInt)
let randomFloat = Float.random(in: 0...100)
print(randomFloat)

let greetings = ["hi", "hello", "yah", "hoo"]
let randomChosenGreetg = greetings.randomElement()
print(randomChosenGreetg!)
let shuffledGreeetings = greetings.shuffled()

ここまでは問題なく理解できますが、Randm Number Generator(RNG)プロトコールの使い方がわからなです。プレセンテーションではstruct型を使って説明しているのですが意味が分かりません。ヘルプドキュメントの次のenum型使ったコードの方が分かりますね。

enum Weekday: CaseIterable {
    case sunday, monday, tuesday, wednesday, thursday, friday, saturday
    
    static func random<G: RandomNumberGenerator>(using generator: inout G) -> Weekday {
        return Weekday.allCases.randomElement(using: &generator)!
    }
    
    static func random() -> Weekday {
        return Weekday.random(using: &Random.default)
    }
}

let randomDay = Weekday.random()
print(randomDay)

struct型の項目をランダムに取り出すことができそうですが、まだ自分で利用することができませんね。RNGプロトコールを準拠するために.random()メソッドの実装はいらないのにね。

まあ難しいことは今のところ考えずに昔のプロジェクトを修正していこう

Swiftで遊ぼう! - 996 - WWDC2018が始まって思うこと

何度もプログラミング勉強を再開させるといいながら、再開できずダラダラしている「50オヤジ」です。

Swift言語のメジャーアップデイトに全くついていけてなくて、Swift 4の概要もまだ分かっていないのに、とうとうWWDC2018が始まってしまいました。

昨年はほとんどプログラミング勉強から離れてしまっていたのでWWDC2017のビデオも全く見てませんでし。今年はKeynoteを全部見ました。なんと、新しいハードウェアの発表がなかったのに加えて、OSも開発ツールもブラシュアップが中心ではないですか〜!

これは神のお告げですね。Swift言語のメジャーアップデイト(Swift 5)の前に、ちゃんとSwift 4を勉強して知識を整理しておきなさい、とティム・クックさんがKeynoteで語りかけているようでした(^_^;)

ということで、Keynoteを聞き終わるやいなや MacOSX 10.14 Betaと Xcode10.0 betaをインストールしました。

WWDC2018のセッションを見ながらSwift 4.2で変化したところを勉強していきます。

Swiftで遊ぼう! - 995 - Developing iOS11 Apps with Swiftの復習から

とうとう「Swiftで遊ぼう!」シリーズは3年目に突入。今年中に自作アプリをなんとかしたい!

昨年の夏にバージョン4に進化したSwift言語の復習を手っ取り早くするのにいい資料はないかなって思っていたらスタンフォード大学のポール先生の講義がアップデイトされていたんで最初っから見なおしです。

「Introduction to iOS 11, Xcode 9 and Swift 4」をみて、今まで知らなかったポイントを2つ紹介します。

一つ目は色の設定をするコードで「Color Literal」を使って視覚的にカラーを設定できます。

「color」とタイプすれば、候補に出てきます。

f:id:yataiblue:20180117161127j:plain

これを選択すると白いスクエアが出現します。

f:id:yataiblue:20180117161212j:plain

このスクエアをダブルクリックするとテーブルが出現するので直接選択できるんです。

f:id:yataiblue:20180117161302j:plain

二つ目はOutletの種類が1つ増えた事です。「Outlet Collection」です。お決まりの「⌃ + ドラッグ」でUIオブジェクトをコードにドラッグした時にコレクションオブジェクトを選択できるようになりました。便利になりましたね。

f:id:yataiblue:20180117161857p:plain

後は特に真新しいことは無かったですね。

Swiftで遊ぼう! - 994 - Macで扱う修飾キーの表示テスト

これからここで使用する「Macの修飾キー」の表示テストをします。Mac環境で読む場合は特に問題なく表示できていますね。Swift関連の記事なんでWindowsで読む人は対象外ということで。

Command Key:⌘
Option Key:⌥
Escape Key: ⎋
Control Key:⌃
Shift Key:⇧
Capslock Key:⇪

上の3つは直接キー入力してます。下の3つはキーコードで表示しています。

皆さん、iOSデベロップメントを諦めてる訳じゃありませんよ。

また戻って来ます。

Swiftで遊ぼう! - 993 - tagを使ってUIViewオブジェクトを扱ったこと無かったです

しばらくプログラミングの勉強から離れていたので、何度も繰り返し勉強したUITableViewControllerを使ったアプリケーションを作っています。

やってみると色々知らないことに出くわしますね。Cellに設置したUIViewクラス継承のオブジェクトをtagを使って制御するという基本的な方法も知らなかったです。

f:id:yataiblue:20171025145721j:plain

上記のようにCell上にUILabelを設置します。これをUITableViewControllerファイルで次のように操作します。

override func tableView(_ tableView: UITableView, 
             cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", 
                                                        for: indexPath)
    let label = cell.viewWithTag(1000) as! UILabel
    label.text = "Run"
    return cell
}

viewWithTag()メソッドを使うのは初めてでした。こういうやり方もあったんですね。

Swiftで遊ぼう! - 992 - Preparing Your App to Run in the Background

Preparing Your App to Run in the Background | Apple Developer Documentation

5つのアプリケーションの状態から5つのトランザクションを経て状態が変化します。Activeなアプリケーションからバックグラウンドに移るときに直接移行できないって以前話しました。

まずdeactivationに入らないといけないので、このときapplicationWillResignActive(_:) が呼ばれて、次の4つのタスクが実行されます。

  • ユーザーデータをディスクに保存してオープンしているファイルはすべて閉じられます。
  • ユーザーのデータを保持する重要なタスクだけこなします。ディスパッチ・キュー、オペレーション・キューも中断して新しい実行タスクは開始されません。
  • アクティブなタイマーは止められます。
  • ゲームプレーも中断します。

これはディアクティベーションのステップで、次はバックグラウンドに移るんですが、applicationDidEnterBackground(_:) が呼ばれます。このメソッドはアプリがバックグラウンドで動き始めているとうシグナルです。次にサスペンド状態に入る前に次のいくつかのステップを踏みます。

  • アプリのユーザーインターフェイスを消去します。表示されている情報を隠して、警告、一時的に表示されているインターフェイスも消し去り、スナップショットを撮るための準備をします。
  • システムと共有しているリソースを解放します。カメラやシステムのデータベースをなど使用しているとシステムは自動的に終了させます。
  • ボンジュール関連のサービスもキャンセルします。
  • 画像、メディアファイル、一時的なオブジェクトもアプリから消去します。NSCacheオブジェクトは自動的に消去されるし、 NSDiscardableContent プロトコールに準拠したオブジェクトも自動的に消去されます。