swift

readLine()をシーケンスのように扱う

Swiftでコンソールアプリを作るときの、標準入力から得た文字列をコレクションのように扱う方法です。 標準入力を扱う処理をシンプルに書く場合、readLine()関数と繰り返しを使って次のようにすることが多いです。 while let line = readLine() { // 入力さ…

Swift3でインスタンスから型メソッドを呼ぶ

ある型(class/struct)のインスタンスを使って型メソッドを呼ぶには、type(of:)関数を使います。 class Foo { static var bar: Int { return 100 } } let foo = Foo() foo.bar // error: static member 'bar' cannot be used on instance of type 'Foo' type(…

ジャンプするSKActionを作る

SKActionには「ジャンプする」を表すアクションがなかったので作ってみました。 public extension SKAction { class func jump(height: CGFloat, duration seconds: TimeInterval) -> SKAction { var initialY: CGFloat = 0.0 var initialFlag = true let cu…

ループ途中で抜ける処理をfilter()等で書き換える

Swiftを触っていると、色々なループをmap/forEachなどで置き換えたくなります。その1パターンの実装例を考えてみます。 目的のデータを探すためのループ ループ処理のユースケースとして、下例のような「目的の値を取り出すために見つかるまでループ。見つか…

SKNodeをロケットのように震わせる

ロケットを発射したときのように、ノードをブルブル震えさせつつ、けれども元々の場所は維持するアクションはどうやって作ったらいいんだろう、と悩んでいました。 調べたところ、ここで紹介されている方法がなかなか良いことがわかりました。Swift 3で書く…

パターンマッチング「func ~=」のデフォルト実装は「func ==」

TL;DR パターンマッチングのルールを自分で定義するときは、~=演算子、つまり「func ~=」を定義することになるわけですが、未定義の場合のデフォルト実装は「func ==」を使うようになっている、という話です。そして、NSObjectのデフォルトはisEqual()が使わ…

UIEdgeInsetsを(強引に)@IBInspectable化する

@IBInspectableで入力できる型は、User Defined Runtime Attributesで指定できる型と同じ、とXcodeのドキュメントには書かれています。つまり、Localized StringやNilを除く以下の型を指定できます。 値の型 オブジェクト エディタ上の状況 Boolean Bool チ…

RxSwiftを勉強していますが、なかなか理解が進まないシリーズです。 RxSwift / RxCocoaのバージョンは2.2を対象にしています。 学習の手始めに「UIButtonがタップされたら、画面上にあるラベルをhiddenにする」というごくごく簡単な処理を書いてみようと思っ…

自前CocoaPodsライブラリで公開するヘッダファイルを限定する方法

CocoaPodsは、自動作成するumbrellaヘッダにデフォルトで全ヘッダファイルを含めます。 Objective-Cだけで書いてある場合、この振る舞いでも特に問題にはなりません。・・・ですが、ライブラリにC++コードなどSwiftで対応しない言語のファイルが含まれている…

RxSwiftのMainSchedulerは何物か

遅まきながら、RxSwiftに手を付け始めました。 github.com リアクティブプログラミングはまったく経験がないので、公式の「Getting Started」を読みながら、概念や基本を調べることにします。 ですが、まだ分からないことばかりで詳細には全然立入れていませ…

(ようやく)SwiftのflatMap()を追いかける

前回(といっても大分前になってしまいましたが)、flatMap==flatten(map())であることから、flatMap()の準備としてflatten()を先に読みました。 swiftlife.hatenablog.jp Swiftのflatten()は平坦化を直ちに行うのではなく、要素が必要になった時にはじめて処…

SKSceneとUIViewとの座標変換

SpriteKitのSKSceneの座標系は、UIViewの左上座標とは異なり、y軸が反転した左下座標系になっています。そのため、UIGestureRecognizerのようなUIView側の座標系をSpriteKitに持ち込むには、座標系を変換してあげなくてはいけません。 具体的には、SKScene…

NSNumberで扱われるSwiftの数値型

SwiftのIntやFloatのようなプリミティブな数値型をCやObjective-Cとで相互に扱う場合、その型は基本的に同じ値域の型で表されます。具体的には「Using Swift with Cocoa and Objective-C (Swift 2.1)」の「Interacting with C APIs」-「Primitive Types」に…

プロパティのアクセスコントロール

Swiftのプロパティで、「getterは外部に公開したいけれど、setterはプライベートにしたい。けれどもcomputed propertyを使って値を保持する変数をわざわざ別に持つのは面倒だ」というケースはよくあります。 そのような場合、「private(set)/internal(set)」…

iOS SDKで利用できるフォント名一覧を取得するスニペット

今回はちょっと短め。 UIFontのメソッドを使って次のように書くことで、実行環境にインストールされている(&利用できる)フォント名の一覧を取得できます。 SKLabelNode(fontNamed: ... )と書いてはみたものの、さて何を指定すればよかったんだっけ?と困った…

flatMap()の前にflatten()を調べる(予想外に深かった)

Swiftを理解するための勉強中です。 前回、前々回でmap()を読んだので、次はflatMap()…といきたいところですが、flatMap()はmap+flattenなので、先にflattenの実装を読むことにします。 swiftlife.hatenablog.jp swiftlife.hatenablog.jp flatten()メソッド…

CollectionType,SequenceTypeのmap()

前回Optional型のmap()を読んだのに続いて、今回はCollectionTypeとSequenceTypeのmap()を見てみることにします。 プロトコルの定義は次のとおりです。 func map<T>(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T] これらはstdli</t>…

OptionalのmapとflatMapを読み解く

Swiftがオープンソース化されたことにより、私たちでも標準ライブラリの実装を読むことができるようになりました。そこで、今回はOptional型のmap()とflatMap()の2つを読んでみて、どういう違いがあるのかを実装面から考えてみようと思います。 Optional型の…

mapに渡せるのはクロージャだけではない

map()では、transform引数にクロージャを渡します。たとえばInt型の配列を文字列化する処理を考えた場合、次のように書けます。 let foo = [1,2,3,4,5,6].map{ String($0) } // ["1", "2", "3", "4", "5", "6"] ですが、このような初期化を伴う処理は次のよ…

mapを学ぶ

さて、少しずつSwiftにも触れていきます。 巷では「Swiftなら関数型プログラミングだよ」「map/flatMapはSwiftのたしなみ」のようなことが言われていて、実際のところ有名どころのライブラリは、こうした考え方を活用して作られています。ですが、正直なとこ…