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 を得るなどのカスタマイズも可能です。

国内のKotlin導入事例

最近Android開発界隈で話題のKotlinについて国内の導入状況をまとめてみます。
見つけ次第随時更新していく予定です。

会社 導入状況 参考サイト 記事投稿日
Qoncept がっつり導入 Android開発を受注したからKotlinをガッツリ使ってみたら最高だった - Qiita 2015/10/05
ヤフー 導入を検討 次世代言語Kotlinを使ったAndroid開発とヤフーの新技術との向き合い方 - Yahoo! JAPAN Tech Blog 2015/12/01
CyberAgent 導入済 Java - 業務でKotlinを書いている僕がKotlinを書く際に個人的に注意していること - Qiita 2015/12/18
2016年、KotlinでAndroid開発する方へ - Qiita 2015/12/23