面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

R.swiftとWARNで競合したので解消した

WARNの説明

Obj-C時代は、#warningを書いて意図的に警告を表示し、後から対応する等のメモがわりに使用していた。(他にそういう人は多いはず)

で、これがSwiftになると使えないので、// WARN:を書いたら同じように警告を表示するようにRun Scriptを入れるわけです。

qiita.com

R.swiftとWARNの競合

便利なR.swiftを利用している人もそれなりにいると思う。

そこで、先ほどの// WARN:のRun Scriptを入れてやったら、自分の環境で競合してerrorがでた。

競合の理由としては、R.swiftが生成するSwiftファイル格納用に作成したフォルダ名R.swiftが、WARNの警告検索対象である*.swiftにひっかかったため。

下記のように除外項目-not -name "R.swift"を入れてやり解消してやった。

KEYWORDS="WARN:"
find ${SRCROOT} \( -name "*.h" -or -name "*.m" -or -name "*.swift" -not -name "R.swift" \) -print0 | \
xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | \
perl -p -e "s/($KEYWORDS)/ warning: \$1/"

iPadのiPhone Appの互換表示モードについて

iOS9が切れたら3.5inchも切れると勘違いしてる人が多い

iOS9系が切れれば、iPhone 4sが最後だから3.5inch端末をサポートしなくてすむ!と喜んでいる輩は多いだろう。

だが、そうはApple(問屋)が卸さん!!

qiita.com

何故か、日本のAppleのレビューする人はiPadiPhoneアプリをチェックすることがしばしば見かける(体感的に)

で、画面崩れていようものならRejectくらうわけですよ。

iPadの互換表示は一律同じではない

ちなみにiPadは、全機種が3.5inchでiPhoneアプリを互換表示するわけではない。

以下が、iPadと互換表示のサイズ

機種 互換サイズ
iPad 2 3.5inch
iPad Air 3.5inch
iPad Air 2 3.5inch
iPad Pro 9.7inch 3.5inch
iPad Pro 10.5inch 3.5inch
iPad Pro 12.9inch 4.7inch

didSetの挙動

didSetの挙動

Swiftでは、Propertyに対してdidSetで処理を書いてあげることが多く、この時呼ばれるの?呼ばれないの?と疑問に思うことがしばしばあって、テストしていたのでまとめておく。

値型と参照型で異なる点は言わずもがな気をつけなければいけない。

呼ばれない

  • init()内で代入した時
  • 配列(NSArray型)で、addingを呼んだ時

呼ばれる

  • 値を入れた時
  • nilを入れた時
  • 配列(Array型)でappendremoveを呼んだ時

UIButtonが青色一色のベタで表示された時の対処

初歩的ミス

IBOutletで紐づけていたUIButtonにコードでimageをセットしてあげるも、青色一色でベタ塗りされた表示になっていた。

理由としては、UIButtonのTypeがSystemだったために画像をセットしても青色で表示されていた。

Customに変えて正常に表示されたので、解決。

tak-lab.net

URLComponentsは、`+`をPercent Encodingしてくれない

経緯

APIを叩く際にランダムに生成しな内容をBASE64化してQueryにつけて送信しようとしていたが、5割ぐらいのエラーになっていた。
調査した結果、+がPercent Encodingされていないためだったが、なぜこんなことが起きたのか…。

便利なURLComponentsの罠

qiita.com

この記事でURLComponentsという便利なものがある!自前でPercent EncodingしてQuery作らなくていいんだ!とうっきうきで使っていたわけだが、+はPercent Encodingしてくれない。(ちなみに+をPercent Encodingすると%2Bになる)

stackoverflow.com

なぜ起こったか

今回のようなことが何故起こったのか。

URLComponentsは、説明にRFC 3986に準拠していると記載されている。サーバ側がRFC 3986に準拠していない作りが理由とも言えるし、自分がそこを確認怠り、URLComponentsを使用したのが理由とも言える。

URLComponents - Foundation | Apple Developer Documentation

サーバの作り次第で、このあたりはいくらでも変わるので、気をつけたいところ。

今回は、時間やコードの手戻りが厳しいこともありURLComponentsでQueryを付けた後、+%2Bに置換する力技で解決した。

URLComponentsに頼らない自作URLComponentsのようなものを作ってもいいかもしれないと思った。