Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

swift

C言語のsizeofをswiftで書くにはMemoryLayout<T>.size

タイトルそのままです。 struct Hoge { var a: Int32 var b: Int32 } MemoryLayout<Hoge>.size // 8</hoge>

Arrayにおけるmap, flatMapの動作(swift3)

ググると引っかかるのか今だにswift2のドキュメントなので、swift3用のメモ let a = [1, 2, 3] let b = a.map { Array(repeating: $0, count: $0) } print(b) // [[1], [2, 2], [3, 3, 3]] let c = [1, 2, 3] let d = c.flatMap { Array(repeating: $0, coun…

enum Optional<Wrapped> の map, flatMapメソッド

swiftのソースでmapとflatMapというメソッドがよく出てくるのだが、このメソッド名からは想像できない動作をするのでメモしておく。 (メソッド名変えてくんないかな。。) Optionalの定義を見ると次のようになっている。 public enum Optional<Wrapped> : ExpressibleB</wrapped>…

swift 2つの連続する矢印

swiftでこんなソースが出てきた。-> が2つ連続しているが意味がすぐには分からない。 func multi(val:Int) -> (val:Int) -> Int { return { a_val in return a_val * val } } 省略されている()を書くとこうなる。 func multi(val:Int) -> ((val:Int) -> Int)…

swift ComparableIndex

swiftのComparableプロトコルはEquatableプロトコルを継承しているので、Comparableと同じことがしたいがEquatableは実装したくないという時に使えない。 その場合、Comparableに相当するプロトコルだけを自分で実装すれば良い。 public protocol Comparable…

PromiseKit4.0 (swift3)を使ってみた 2016年11月

swift3で作ったiOSアプリでサーバーへHTTPリクエストを複数回投げる場合に、 普通に作ると、正常ケース、異常ケースの処理があちこちにばらけて、ソースが汚くなります。 PromiseKitを使ったところ、ソースが短く、処理も追いやすくて素晴らしかったので、メ…

swiftでフェルマーの素数定理をInt64の範囲内で確認してみる

最近、素数の本を読んで面白かったので、 フェルマーの素数定理 任意のp:素数 n:自然数に対して、np - n を p で割った余りは 0 である。 をswiftで数値計算でInt64の範囲でいいから確認してみたい欲求に駆られ、実装してみました。 import Foundation infix…

swift C言語形式のループの置き換え

swift3ではC言語形式のループが廃止されます。 swift2.2の現時点では、deprecatedになっています。 書き換え方がわかりずらいのでメモ print("case to") for i in 0.stride(to:2, by:1) { print(i) } for i in 0..<2 { print(i) } print("case through") for…

swiftでのmarkコメントの書き方

Objective-Cでは以下のように書いていましたが #pragma mark - UICollectionViewDelegate swiftではこう書きます。 // MARK: - UICollectionViewDelegate もしくは /* * MARK: - UICollectionViewDelegate */

swift objc_overrelease_during_dealloc_error

objc_overrelease_during_dealloc_error というエラーでクラッシュしていたんだが、 takeRetainedValue() を takeUnretainedValue() に変えたら落ちなくなった。 retainしすぎていたということか。 swiftでのUnmagedはイマイチ理解できていない。

try! swift 参加レポート

3/2-4 渋谷マークシティにて行われたtry!swiftカンファレンス http://www.tryswiftconf.com に参加してきましたので簡単な感想です。 スピーカー33名(日本人2割)、参加者約500名(日本人8割) という規模のswift言語やApple関連ソフトウェアに関する コミュニ…

swift タイプエイリアス

Type Aliases typealias AudioSample = UInt16 プロトコルのAssociated Typeには特定のプロトコルに準拠することという条件を付けられる。 protocol PBProtocol { typealias PBError: IntegerType } class PBClass: PBProtocol { typealias PBError = Int } …

swift 列挙型

enum CompassPoint { case North case South case East case West } var directionToHead = CompassPoint.West directionToHead = .East directionToHeadは一旦、varで代入されて型が固定されると、次の行以降はdot表現が使える。 Associated Values enum Ba…

swiftで定義した構造体、列挙体はObjective-Cでは使えない

swiftで定義した構造体、列挙体はObjective-Cでは使えないようだ。 使えないもののリストはこちら。 Generics Tuples Enumerations defined in Swift without Int raw value type Structures defined in Swift Top-level functions defined in Swift Global …

swift ジェネリクス、プロトコル

struct Stack<Element> { var items = [Element]() mutating func push(item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } } このジェネリック構造体を拡張してみる。 ジェネリック型を拡張する際は、extensionの</element>…

swift クロージャ

swiftを久々に触ったら、クロージャの文法を完全に忘れていたので、メモしておく。 Closure Expression Syntax クロージャはこの形をしている。 { (parameters) -> return type in statements } 例えば、このように使う。 let names = ["Chris", "Alex", "Ew…

swiftをC++11に移植する

なぜか、swiftをC++11に移植しているのですが、思ったより楽でした。 C++11の機能はまだ慣れていないので、メモを残しておきます。 1) クラスメンバの宣言時初期化 class Book { Book() {} float price = 10.0; }; 2) swiftクラスのinitが2つあったとして、…

pure vimでswift自動補完する

pure vimでswift自動補完するvim pluginを作った方がいらっしゃるので紹介しておきます。 動作確認はOSX 10.10.5 (Yosemite) Xcode 7.2で行いました。 github.com このプラグイン自体はbundleなどでインストールするだけですが、 以下のsourcekittendaemonと…

swift3でCoreAudioを使う 再生編

swiftでCoreAudioを使ってみます。 ラ(440Hz)のサイン波の音を再生するサンプルです。 import Foundation import AudioUnit import AudioToolbox import AVFoundation class MyAudioPlayer { var _audiounit: AudioUnit? = nil var _x: Float = 0 let _sampl…

swiftの好きなところ、嫌いなところ

swiftの好きなところ嫌いなところです。 比較対象はObjectiveCなので、ObjectiveCにある機能やC++にある機能は除きます。 swiftの好きなところ第3位 未初期化の変数があるとコンパイルが通らない。 よくある言語実装のように、変数があったらデフォルト値で…

XVim swift応用編

この記事では、XVimに組み込まれたswift関連機能の説明をします。 XVimとはXcodeをvimキーバインドにするXcodeプラグインです。 インストール方法や使い方はこちらを参照して下さい。 XVimProject/XVim · GitHub この機能をXVimに取り入れたモチベーションの…

C言語の構造体をswiftで扱う

分かったこと。 1. swiftでC言語の構造体を別変数へ代入すると全ての要素が代入される。つまりC言語と同じ動作をする。 2. C言語の構造体内のポインタにはC言語側で入れたアドレス値が入っていてswift側でそのまま、UnsafeMutablePointerとして扱える。 3. C…

Xcode6.4でボトルネックとなっている遅い処理を特定する(iOS/OSX)

Xcodeに付属するInstrumentsで遅い処理を特定する手順です。 Instrumentsの中のTimeProfilerを使います。 Profileを実行します。 TimeProfilerを選択します。 赤いボタンを押すと実行が始まります。 スレッド毎にかかった時間(milliseconds)と比率(%)が表示…

C言語、swift速度比較

4096 * 10,000 個のfloatに特定の演算をしたときの時間。 C index指定 115791 us C ポインタ指定 116161 us swift 5469 us swift vDSP 9235 us AccelarateフレームワークがなぜかPure Swiftに負けてる。

Cの構造体を引数でswiftに渡す

構造体も構造体ポインタもどちらも渡せるが、構造体ポインタのときはmemoryとたくさん書くことになる。ソース可読性を優先すると構造体の方がよさそう。速度については構造体ポインタの方が若干速いようだ。 swift1.2 Optimization Level : Fasttest [-O] 1,…

swiftのクラスをobjective-Cで継承することはできない

stackoverflow.com あるクラスをobjcからswiftへ移行するなら、継承関係にあるクラスはすべて、いちどきにswiftに書き換えないといけない。

ObjCのNS_ENUMのswiftからの見え方(swift2)

Objective-CでNS_ENUM定義がswiftでどのように見えるか実験した。 enum.h typedef NS_ENUM(NSUInteger, Element){ ElementFire, ElementWater, }; typedef NS_ENUM(NSUInteger, FRUIT){ FRUIT_APPLE_1, FRUIT_ORANGE_2, }; typedef NS_ENUM(NSUInteger, ANIM…

ObjCからswiftソース上で呼び出せるのはクラスまたはプロトコルのみ

勘違いしていたが、ObjC側からswiftソース上で呼び出せるのは、クラス(のメソッド)、プロトコル、整数型のenumのみだった。 swift上で書いたグローバル関数やグローバル変数は呼び出せないのだった。逆は可能。 つまり、ObjCのクラスはswiftへ移行できるが整…

swift Array withUnsafeBufferPointer

struct Array<T> : MutableCollectionType, Sliceable, _DestructorSafeContainer { } extension Array { func withUnsafeBufferPointer<R>(body: @noescape (UnsafeBufferPointer<T>) -> R) -> R mutating func withUnsafeMutableBufferPointer<R>(body: @noescape (ino</r></t></r></t>…

swift Reflectableプロトコル

Reflectableプロトコルとは、型情報を扱うためのものと考えて良い。 protocol Reflectable { func getMirror() -> MirrorType } protocol MirrorType { var value: Any { get } var valueType: Any.Type { get } var objectIdentifier: ObjectIdentifier? { …