読者です 読者をやめる 読者になる 読者になる

Pebble's Diary

プログラマーの作業メモ

swift Arrayでwhereを使う

swiftはモダンな言語なので、C言語風の書き方は極力排除されている。 Arrayでwhereがついているメソッドを使い条件式を表すクロージャを指定して結果を取得するケースは多い。 public struct Array<Element> : RandomAccessCollection, MutableCollection { // 条件を</element>…

swiftでwavファイル書き込みしてみる

以前はAudioToolKitにあるAudioFileCreateWithURLを使っていましたが、 ここでは試しにiOS8,macOS10.10で追加されたAVFoundationにあるAVAudioFileを使ってみます。 まず、AVAudioFileのクラス定義をみてみます。 open class AVAudioFile : NSObject { publi…

swiftでFloat値の比較

swiftでは次のような演算子が定義されているので、FloatどうしやDoubleどうしの比較は 単純に==と!=で行えば良い。 FloatやDoubleはFloatingPointを継承しているため、この機能を持っている。 public func ==<T : FloatingPoint>(lhs: T, rhs: T) -> Bool public func !=<T : Equatable>(lhs: T</t></t>…

swift アクセス制御

open どこからでもサブクラスの作成、上書き定義可能 public このクラスを定義したモジュール内部でのみサブクラスの作成、上書き定義可能 internal (省略時) 定義を含むソースファイルと同じモジュール内部からアクセス可能 private クラスや構造体の定義単…

swift extensionで一回だけ実行されるグローバル定数宣言の仕方

こうすればいいらしい。 extension DateFormatter { public static let standard: DateFormatter = { let obj = DateFormatter() obj.locale = Locale(identifier:"en_US_POSIX") return obj }() }

swiftでsingleton

swiftでSingletonを書く場合、こうすればいいらしい。 class MySingleton { static let shared = MySingleton() private init() {} } The Right Way To Write a Singleton — KrakenDev

詳説 AudioStreamBasicDescription / AVAudioFormat

CoreAudioでよく使われるAudioStreamBasicDescription これはC言語の構造体で使いづらいです。 macOS10.10, iOS8以降ではAVAudioFormatと相互変換できますので、これを経由するとコーディングが簡単になります。 まずは実例を見ていきます。 よく使われる.wa…

iOS10のSpeechToText APIを使って日本語PodCastをテキスト化してみる

iOS10で公開されたSpeechフレームワークを使って日本語PodCastをテキスト化してみました。 結果から言うと、テキスト化は可能でしたが、品質はかなり悪く実用として厳しかったです。 某IT系PodCastのファイルを食わせて見たんですが、 「ジャバスクリプト」…

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…

pure vimでswift自動補完する

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

swiftでCoreAudioを使ってみる。(swift3 update 2017-02)

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? { …

swift標準ライブラリ調査その1 ジェネリクス

swiftの標準ライブラリはすんなり理解できないところが多いため、一つづつ調べていきたい。 struct Array<T> : MutableCollectionType, Sliceable, _DestructorSafeContainer { } extension Array : _ArrayType { init<S : SequenceType where T == T>(_ s: S) } このイニシャライザのwhere T =</s></t>…

SwiftでAtomic操作

Swiftで変数にatomicにアクセスしたい場合、幾つか方法があるが、OSSpinLockを使う方法をここでは紹介する。 他の方法との時間の比較も時間があればやりたい。 まずは、排他処理なしの場合に動作がダメなことを確認する import Foundation let sz = 1000 var…

UnsafeMutableAudioBufferListPointer

iOS8.3(2015年7月)リリースタイミングで追加されたらしい。 やっとswiftでまともにAudioBufferListが扱えるようになった。 UnsafeMutableAudioBufferListPointer developer.apple.com stackoverflow.com

swiftとObjective-Cのメソッド呼び出し時間

swiftとobjective-Cのメソッド呼び出し時間はどのくらい違うのか、試してみた。 空っぽのメソッドを1回呼び出すのにかかる時間 デバッグビルド(OSX10.10、Xcode7GM) objc 0.119μsec swift 0.043μsec リリースビルド(OSX10.10、Xcode7GM) objc 0.007μsec swif…

swiftでIntをBoolに変換するときの注意

swiftでIntをBoolに変換するときの注意 これはコンパイルエラー let a:Int = 1 let b:Bool = (a!=0) // Operand of postfix '!' should have optional type; type is 'Int' これはコンパイルOK let c:Int = 1 let d:Bool = (c != 0) これはコンパイルエラー …

swiftのクラスのポインタをC言語に渡してコールバック後にクラスに戻す(swift3)

[2017-02-12 update] swift3からunsafeBitCastではなくUnmanagedを使う方法が推奨となっていますのでそちらをお使いください。 unsafeBitCastを使ってswiftのクラスをポインタとして扱い、コールバック後のクラスに戻して動作するかやってみた。 結論から言…

swift2でC言語の関数ポインタが利用できるようになった(swift2)

swift2でC言語の関数ポインタが利用できるようになった。 例えば、以下のように書けるようになった。 cfile.h typedef int (*OPERATION)(int, int); int execute(OPERATION operation, int a, int b); cfile.c #include "cfile.h" int execute(OPERATION ope…

swiftでの変数のサイズ取得

C言語 int32_t a; sizeof(a); sizeof(int32_t); swift var a:Int32 sizeof(Int32) sizeofValue(a)

taglist.vimをswift対応する

taglist.vimをswift対応してみました。 こちらを参考にしました。 ctags を Swift に対応させる - Qiitaqiita.com 必要な手順は2つ 1) ~/.ctagsに以下を追加する。 --langdef=Swift --langmap=Swift:+.swift --regex-swift=/(var|let)[ \t]+([^:=]+).*$/\2/…

swift文字列走査

swiftで文字列の走査をする方法。 swiftは型に厳しいので、stringのsubscriptに指定する型はString.Indexである必要がある。 もっとも単純にやる場合、次のようになる。 var str = "Hello" var i:String.Index = str.startIndex // 0 var end:String.Index =…

swiftで使えるAtomic系API (OSX/iOS)

swiftで使えるAtomic系APIがあったので備忘録としてリストアップしておく。 OSX/iOSで確認した。 func OSAtomicAdd32(__theAmount: Int32, __theValue: UnsafeMutablePointer<Int32>) -> Int32 func OSAtomicAdd32Barrier(__theAmount: Int32, __theValue: UnsafeMu</int32>…

swiftで構造体またはクラスをArrayにする際に気をつけること(2)

class CPoint :Printable { var x:Int = 0 var y:Int = 0 init() {} var description:String { return "x[\(x)] y[\(y)]" } } struct SPoint :Printable { var x:Int = 0 var y:Int = 0 var description:String { return "x[\(x)] y[\(y)]" } } var v2:[SPoi…

swiftで構造体またはクラスをArrayにする際に気をつけること(1)

swiftでは構造体は値渡し、クラスは参照渡しと言われますが、実際に使ってみて失敗した方が理解が早いです。 以下のサンプルと実行結果を見てみます。 class CPoint :Printable { var x:Int = 0 var y:Int = 0 init() {} var description:String { return "x…