try! Swift 1日目個人まとめ

初めにまとめサイト紹介

スライドの写真もある速記まとめ

全日程の資料まとめ

クラスメソッドさんのまとめ

個人まとめ

"Swiftのエコシステムに飛び込む" : "Dive into Swift Ecosystem"

レポート

  • エコシステムに貢献する段階
    • 使う。
    • Git HubならStarを付ける。
    • 同僚への紹介やSNSで共有する。
    • ISSUEを立てたり、質問する。
    • 質問に答える。
    • pull requestを出す。

まとめ

  • 次の話をされていました。
    • Swiftオープンソース化された話
    • 開発、デプロイ、CIなどのオンラインサービスの話
    • 開発者ツールの話
    • エコシステムに貢献する話

"実践的クロスプラットフォームSwift" : "Practical Cross-Platform Swift"

レポート

  • 開発環境の3パターン
  • Cross-Platformを前提に開発するならXcodeに依存していない Swift Package Manager がお勧め。
  • 見えないところでのobjcランタイムへの依存などがあり、Linux環境では注意が必要。

まとめ

  • Cross-Platform上でSwiftを使う話をされていました。
  • Linux環境ではまだまだ罠があるので辛そうでした。

"コードリーディングについて" : "Learning to Read Again"

まとめ

  • 知らないコードを人はどのように読むのか話されていました。
  • 知らない人がコードを読み理解できなかった時に、どのような情報が欠けているかヒアリングして情報を洗練させていくと良いそうです。

"📺(AppleTV)"

レポート

  • iOSとTVOSは似ている。diffもAppleが出している。
  • TVOSに足りないもの。
    • WebKit: OAuthができない。
    • LocalStorege: 500KBのUserDefaultsのみ。
  • TVOSにはforcusという概念がある。

まとめ

  • TVOSの紹介でした。iOSアプリをTVOSに移植した話もありました。

"平常心で型を消し去る" : "Keep Calm and Type Erase On"

レポート

  • Swiftには共変性がない。

まとめ

  • 型とはそもそも何かという話をした後で、型が消え去ってしまうケースを紹介されていました。
  • 実装で遭遇するケースは少ない気がしますが、具体的なコードについてはまとめページにあるスライドを見るかこちらの解説記事を見てください。

"Swiftのエラー処理についての三つの話" : "Three Stories about Error Handling in Swift"

まとめ

  • 他の言語(C,Javaなど)との比較を交えながら、Swiftのエラー処理パターンがそれらの特徴とともに紹介されていました。
  • 発表で使われていたコードは↓にあります。 http://koherent.org/tryswift/codes.html

"プロトコルと約束の地" : "Protocols and the Promised Land"

まとめ

  • Swift-objc間での制約、SwiftGenericsの制約について紹介されていました。

"文化を調和させる" : "Blending Cultures"

まとめ

  • OOP.FP,POPの文化を調和させたコードを紹介されていました。
  • 既存のコードをリファクタリングしていく形での発表だったので非常に分かりやすかったです。
  • 既存のコードではCellのMove処理が複雑だったのですが、immutableなオブジェクトにし、(関数型プログラミングっぽく)実装しなおしたことで非常にコードの見通しが良くなったところが印象的でした。

"Core Animationで作る高度なグラフィックス" : "Advanced Graphics with Core Animation"

まとめ

  • Core Animationについて紹介されていました。
  • Animationを作る際に便利なツールも紹介されていました。ツールの中には標準アプリをハックするツールも紹介されていました。

"スマートホームのためのコード" : "Code for the Smart Home"

まとめ

  • HomeKitについて紹介されていました。

"目に見えないものを学ぶ" : "How To Be Invisible"

まとめ

  • 非常に難しい内容でした。
  • おそらく、ユーザの目に見えていない潜在的な課題を学び、解決するアプリを作っていこう、またそのアプリは中毒性があるもの(Digital Crack)であってはならない。という内容だったと思います。

以上です。

iOS SystemFont サイズ毎のラベルの高さ。

デザインの指定で「高さはラベルいっぱいでお願いします。」とかあるので調べてみました。

結果

Font Size: 1, heihgt: 1.5
Font Size: 2, heihgt: 2.5
Font Size: 3, heihgt: 4.0
Font Size: 4, heihgt: 5.0
Font Size: 5, heihgt: 6.0
Font Size: 6, heihgt: 7.5
Font Size: 7, heihgt: 8.5
Font Size: 8, heihgt: 10.0
Font Size: 9, heihgt: 11.0
Font Size: 10, heihgt: 12.0
Font Size: 11, heihgt: 13.5
Font Size: 12, heihgt: 14.5
Font Size: 13, heihgt: 16.0
Font Size: 14, heihgt: 17.0
Font Size: 15, heihgt: 18.0
Font Size: 16, heihgt: 19.5
Font Size: 17, heihgt: 20.5
Font Size: 18, heihgt: 21.5
Font Size: 19, heihgt: 23.0
Font Size: 20, heihgt: 24.0
Font Size: 21, heihgt: 25.5
Font Size: 22, heihgt: 26.5
Font Size: 23, heihgt: 27.5
Font Size: 24, heihgt: 29.0
Font Size: 25, heihgt: 30.0
Font Size: 26, heihgt: 31.5
Font Size: 27, heihgt: 32.5
Font Size: 28, heihgt: 33.5
Font Size: 29, heihgt: 35.0
Font Size: 30, heihgt: 36.0

コード

使ったコードはこちらです。

import UIKit

var label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
label.text = "hoge"

for size in 1...30 {
    label.font = UIFont.systemFontOfSize(CGFloat(size))
    label.sizeToFit()
    
    print("Font Size: \(size), heihgt: \(label.frame.size.height)")
}

こういう時にPlaygroundは非常に便利です。

SwiftのArrayを拡張してremoveメソッドを追加する。

SwiftのArrayには removeAll や removeAtIndex はありますが、removeしたい element を渡して remove するメソッドがありません。
そこで、removeメソッドを追加しました。

参考にしたのはstackoverflowのこちらの記事です。
stackoverflow.com

上記の記事で紹介されている通りSwift2以降では下記コードで実装するようです。

extension RangeReplaceableCollectionType where Generator.Element : Equatable {

    // Remove first collection element that is equal to the given `object`:
    mutating func removeObject(object : Generator.Element) {
        if let index = self.indexOf(object) {
            self.removeAtIndex(index)
        }
    }
}

RangeReplaceableCollectionType という見慣れない protocol が出てきました。
RangeReplaceableCollectionType のReferenceを見ると妥当な protocol のようなのでこちらを拡張すると良さそうです。
上記コードのコメントに書いてある通り、こちらだと最初のヒットした element しか remove しないので、今回は複数の値がヒットした場合も remove するメソッドに変更して使用しました。
コードは下記の通りです。

extension RangeReplaceableCollectionType where Generator.Element : Equatable {
    
    mutating func remove(element : Generator.Element) {
        guard let index = self.indexOf(element) else { return }
        self.removeAtIndex(index)
        self.remove(element)
    }
}

地方在住ITエンジニア(元・地方在住も可) Advent Calendar 2015 を一通り読んでみて。

将来的は地方で働きたいという思いがあるので、こちらのAdvent Calendarの全記事ざっと読みました。
記事の中で書かれている地方の特徴を簡単にまとめておこうと思います。

www.adventar.org

お金

  • 家賃は安い。
  • 家賃以外の生活費はあまり変わらない。
  • 平均給料は低い。

住居環境

  • 自然が多くて住みやすい。
  • 人が多すぎず住みやすい。
  • 場所によるが自動車必須。

求人

  • もちろん仕事は少ない。
  • 情報はWebにほとんどなく、地元のハローワーク

働き方

  • 地方の方が新鮮で美味しい。

技術動向

  • 勉強会が少ない。
  • エンジニアが少ない。特に最新の技術を追っているようなエンジニア。
  • 技術書を立ち読みできる書店がない。

一通り読んでみて思った事や最近考えている事

  • お金に関しては自分が将来どういう人生を過ごすか次第なのでそこ含めて考える。
    • 「質素で幸せ」というフレーズが最近気に入っているのでそんな感じが良い。
  • 自然が多くて何が良いかというと四季を身近に感じられることだと思っているんだけど、都心でも努力次第で四季を感じられる生活は送れるかもしれない。
  • ハローワーク。なるほど。地方はコネがより重要だと感じた。コネというか信頼関係というか。
  • リモートワークする場合は、リモートワーク元との信頼関係大事。
    • リモートワーク元の社員の方と一緒に働いて信頼関係作る期間が必要。それが仕事じゃなくても良い。
  • フリーランスも起業も地元のコネが無いときつい。オリジナルサービスあれば違うかも。
  • 勉強会少ないけど、最近ネット配信してるところも多いから問題ないと感じてる。発表する立場なら別だけど。
  • 技術書立ち読みできないのはちょっと辛そう。

Argo でnullの場合に空文字や配列を得る。

ArgoはSwiftJSONのParse処理を簡潔に記載できるライブラリです。

github.com

ちょっと古い記事ですが まだSwiftyJSONで消耗してるの? - Qiita でも紹介されています。

ただ、今回のアプリでは以下の振る舞いの方が都合が良くメソッドを追加しました。

  • JSON の型が 文字列 で値が null の場合に空文字として扱う
  • JSON の型が 配列 で値が null の場合に空の配列として扱う
import Argo

infix operator <||?? { associativity left precedence 150 }

private func <| <A where A: Decodable, A == A.DecodedType>(json: JSON, kv:(key:String, orValue:A)) -> Decoded<A> {
    return json <|? kv.key >>- { $0 == nil ? pure(kv.orValue) : pure($0!) }
}

/**
 受け手がString(not Optional)でJSONがnullの場合に空文字を取得します。
 
 - parameter json: json
 - parameter key:  key
 
 - returns: value or empty
 */
func <| (json: JSON, key: String) -> Decoded<String> {
    return json <| (key: key, orValue: "")
}

/**
 受け手がArray(not Optional)でJSONがnullの場合に空のArrayを取得します。
 <|| では コンパイラが ambiguous と怒ってくるので <||?? で定義します。
 
 - parameter json: json
 - parameter key:  key
 
 - returns: value or empty array
 */
func <||?? <A where A: Decodable, A == A.DecodedType>(json: JSON, key: String) -> Decoded<Array<A>> {
    return (json <||? key >>- { $0 == nil ? pure([]) : pure($0!) })
}

数値型のプロパティが null の場合に -1 を得るなどのカスタマイズも可能です。