文字っぽいの。

文字を書いています。写真も混ざります。

Swiftでクソコードを認める文法をつくった

はじめに

ジョークです

文脈

これのF#実装が出てきた

せっかくなのでSwiftで書いてみた。

実行環境

  • Xcode9.4.1
  • Swift 4.1.2

実装

import Foundation

@available(iOS, deprecated: 1, message: "[KUSO] これはクソコードです")
func kuso(_ block: () -> Void) {
    block()
}

使うときは

kuso {
    // ここにクソコードを書く
}

こうやって書きます。

実行結果

f:id:FromAtom:20180705212933p:plain

ちゃんと警告がでて便利ですね。

余談

Warningを出したいと思って色々調べてたんだけど、Swift4.2から

#warning("this is incomplete")

と書けば警告を出してくれることがわかった。

ただ、この方法だと #warning を書いた場所に警告が出てしまって kuso {} を利用している場所では警告が出せない。なのでDeprecated警告をだす文法を利用して表示しました。

まとめ

明日から業務で使えない情報でした。

参考文献

qiita.com

CocoaPodsで入れたライブラリのWarningを消す方法

困りポイント

CocoaPodsを利用してライブラリの管理をしている人は多いと思いますが、ビルド時にLibraryのWarningも大量にでて困ることがあると思います。こんな感じで

f:id:FromAtom:20180625174340p:plain

これでは、自分の開発しているアプリのWarningが埋もれてしまいますね。

解決方法

inhibit_all_warnings! を指定してあげれば良いです。公式のドキュメントはこちら

guides.cocoapods.org

実際に指定しているPodfileはこんな感じです。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'sample-app' do
  use_frameworks!
  inhibit_all_warnings! # <= この指定を追加する
  
  pod 'DTCoreText'

  target 'sample-appUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

inhibit_all_warnings! を追加した後に

$ pod install

をしたあとでXcodeでビルドを実行してみると

f:id:FromAtom:20180625174804p:plain

すごい!なにも表示されなくて、まるでビルドしていないかのようです。実際に開発していれば、ここにはSwiftLintやコンパイラが吐いてくれるWarningが表示されるので便利です。

iOS 12でOpenGL ESがDeprecatedになったので、Metalを使うにはiOSいくつ以降をサポートすれば良いのか調べた。

結論

  • iOS 11以降のサポートにすればよい
  • iPhone 5, iPhone 5c, iPad(4th) がMetal非対応だがiOS 10がインストール可能になっている
  • Apple公式的には最新2つのメジャーバージョンのサポートを推奨している
  • iOS 12が落ち着いたらiOS 10のサポート終了を準備しながらMetalの実装をすると良さそう
  • もしくはiOS 10をサポートしつつ、特定デバイスでは「ごのデバイスではこのアプリはご利用いただけません」的な表示をする手もある

各デバイス便利表

iPhone

バイス 発売年 Metal 解像度 @Nx iOS 8 iOS 9 iOS 10 iOS 11 iOS 12
iPhone 4S 2011 × 640 x 960 @2x × × ×
iPhone 5 2012 × 640 x 1136 @2x × ×
iPhone 5c 2013 × 640 x 1136 @2x × ×
iPhone 5s 2013 640 x 1136 @2x
iPhone 6 2014 750 x 1334 @2x
iPhone 6 Plus 2014 1242 x 2208 @3x
iPhone 6s 2015 750 x 1334 @2x -
iPhone 6s Plus 2015 1242 x 2208 @3x -
iPhone SE 2016 640 x 1136 @2x -
iPhone 7 2016 750 x 1334 @2x - -
iPhone 7 Plus 2016 1242 x 2208 @3x - -
iPhone 8 2017 750 x 1334 @2x - - -
iPhone 8 Plus 2017 1242 x 2208 @3x - - -
iPhone X 2017 1125 x 2436 @3x - - -

iPad

バイス 発売年 Metal 解像度 @Nx iOS 8 iOS 9 iOS 10 iOS 11 iOS 12
iPad 2 2011 × 768 x 1024 @1x × × ×
iPad mini 2012 × 768 x 1024 @1x × × ×
iPad (3rd) 2012 × 1536 x 2048 @2x × × ×
iPad (4th) 2012 × 1536 x 2048 @2x × ×
iPad Air 2013 1536 x 2048 @2x
iPad mini 2 2013 1536 x 2048 @2x
iPad Air 2 2014 1536 x 2048 @2x
iPad mini 3 2014 1536 x 2048 @2x
iPad mini 4 2015 1536 x 2048 @2x - ◯|◯
iPad Pro (12.9 1st generation) 2015 2048 x 2732 @2x -
iPad Pro (9.7) 2016 1536 x 2048 @2x -
iPad Pro (10.5) 2017 1668 x 2224 @2x -
iPad Pro (12.9 2nd generation) 2017 2048 x 2732 @2x -
iPad (2017) 2017 1536 x 2048 @2x - -
iPad (2018) 2018 1536 x 2048 @2x - - - ◯|◯

iPod Touch

バイス 発売年 Metal 解像度 @Nx iOS 8 iOS 9 iOS 10 iOS 11 iOS 12
iPod touch (5th) 2012 × 640 x 1136 @2x × × ×
iPod touch (6th) 2015 640 x 1136 @2x

Comparable#clampがSwiftにも欲しいので作った

Comparable#clamp という便利メソッドを知った。

blog.bigbinary.com

いままではこう書いていた

let number = 100
let lowerLimit = 0
let upperLimit = 20
min(max(lowerLimit, number), upperLimit) // => 20

Swiftにもほしいと思って調べたけど、Rangeの clapmped ってのだけ出てきて見つからなかったので書いてみた。

extension Comparable {
    func clamp(to limits: ClosedRange<Self>) -> Self {
        return min(max(limits.lowerBound, self), limits.upperBound)
    }
}

これを定義しておくと最初のコードは

let number = 100
number.clamp(to: 0...20) // => 20

と書けて便利。

もうちょっと良い書き方とかあったら教えてもらえると喜びます。

「ずるい」ではなく「いいなぁ」って言うとすべてが上手くいく

気がする。

子供のしつけで「ズルいわけじゃないんだよ」って教えるってのよく話題になる気がする。そもそも「ずるい」って

《形》人をだしぬいて自分が得をするような、正しくないやりかただ。わるがしこい。こすい。

という意味なので、ネガティブなんですよ。あいつは悪事を働いて不当に利益を得ている的な。だから「ずるい」って言われると「これは正当な権利でウンヌン」って説明から入るじゃないですか。マイナスイメージをゼロにしてから、じゃあ全員をプラスにするにはって話をしないといけない。これはすごいコストがかかって、だいたいマイナスをゼロにして「あー、疲れた」ってなって終わってしまう。

「いいなぁ」って会話から始まると、ゼロからプラスにする建設的な話がしやすい気がするんですよ。気がするだけだけどね。

「新卒が今の発言をしても許されるか?」という基準で自分の発言を鑑みる

3年も働いていると地位や信頼値にも変化があり感覚が鈍ってくるので、思考ゲームをして遊んでいる。

  • 自分の立場に甘んじた発言をしていないかが分かる(ときがある)
  • 覚悟をもって発言しているかが分かる(ときがある)
  • もし新卒がその発言ができない場合、心理的安全性が確保されていないと分かる(ときがある)

遊びです。当然ですが、発言の内容にもよります。