20190126のiOSに関する記事は4件です。

特定の条件を満たす要素を指定個数分だけ取り出す関数の実装

はじめに

以前の 記事 に書いた「特定の条件を満たす要素を指定個数分だけ取り出す」に必要な実験が全て完了したので、実際の動作を実装する。

なお、中で使用しているgetElements()の実装は こちら

実装

ソースコード
func filterElements(point: Int, elements: Int, array: [Int]) -> [Int] {
    let targetList = array.filter{ point <= $0 }
    return getElements(elements: elements, array: targetList)
}
テストパターン
(point: 0, elements:5, array: [1,3,5,7,9]),[1,3,5,7,9],"全取出(対象:0以上の要素)")
(point: 5, elements:0, array: [1,3,5,7,9]),[],         "最大3個 取出個数 下限値未満")
(point: 5, elements:1, array: [1,3,5,7,9]),[5],        "最大3個 取出個数 下限値")
(point: 5, elements:3, array: [1,3,5,7,9]),[5,7,9],    "最大3個 取出個数 上限値")
(point: 5, elements:4, array: [1,3,5,7,9]),[5,7,9],    "最大3個 取出個数 上限値超過")
(point:10, elements:5, array: [1,3,5,7,9]),[],         "該当なし(対象:10以上の要素)")
実行結果
0 failures

テストパターンと実行結果の表記についての記事

結果

予定通りの動作が完成した。
テストコードもあるので、Swiftの標準構文やシンタックスシュガーで置き換えられるものを見つけたら随時対応する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dart x Flutter で RenderBox/Canvas 関連のAPI を 試してみた。 2019年

Flutter で、 Render関連の情報が少ないので、昨年に書いたものを更新をしてみました。

1515374139.gif

みたいなのが、簡単に作れます。
初期段階 flutter でも、https://kyorohiro.github.io/umiuni2d/web/index.html のデモページにあるような、2dゲームなどが簡単に作れました。ので、今だと、より容易に作成できるのではないでしょうか

Hello World

スクリーンショット 2018-01-08 18.28.57.png

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/hello.dart

四角形を描画

スクリーンショット 2018-01-08 18.28.16.png

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_rect.dart

Animation

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/anime_rect_scheduller.dart

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/anime_rect.dart

画像を表示

スクリーンショット 2018-01-08 18.30.48.png
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_image_assets.dart

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_image_dartio.dart

画像の変形

スクリーンショット 2018-01-08 18.32.13.png

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/rotate_image.dart

タッチイベント

スクリーンショット 2018-01-08 18.33.33.png
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/touch_test.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/multitouch_test.dart

TTF フォントでテキスト表示

スクリーンショット 2018-01-08 18.32.54.png

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_text.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_text_ttf.dart

Vertexs 関連

スクリーンショット 2018-01-08 18.34.32.png

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_path.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_vertexs.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_vertexs_image.dart

PS

こんな感じで、大体の機能は揃っていますね。

Memo : Flutter x Dart [2015-2016]

Memo : Dart x Flutter [2018]

Memo : Dart x Flutter [2019]

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MultiPeerConnectivityのライブラリBeerKitを作りました。

ARKitを使った空間共有アプリを作るに当たってデバイス間通信の実装についてよく考えています。

iPhoneどうしで通信するに当たって一番便利なのがMultiPeerConnectivityです。MultiPeerConnectivityはWifiやbluetooth、そしてiPhoneの持っているp2p通信のシステムを使ってローカルのデバイス間通信をするためのフレームワーク

そしてこのMultiPeerConnectivityを上からラップして使いやすくしているライブラリにPeerKitがあります。

日本語記事だと以下で紹介されています。

[iOS][Swift] イベント駆動型で P2P 通信をするPeerKit

PeerKitに問題があったのでフォークした

しかし、このPeerKit、

  • 繋がりにくい
  • 一度外れると復活できない

などなどのバグが少しあり、そのまま使うとハマってしまいます。メンテされていると良いのですが、このライブラリは現在メンテされていないようです。

ということで僕がフォークしていくつか修正したのがkboy-silvergym/PeerKitです。

しかしまだ問題があって、うまく繋がらないことがありました。

もう上から編集していくのはきつい。。!ってことで、真似して新しいライブラリをつくってみました。

BeerKit

スクリーンショット 2019-01-26 20.52.24.png

PeerKitを真似てBeerKitという名前で作ってみました。ビールで乾杯するというローカルコミュニケーションはまさにP2P通信と言っても過言ではありません。

PeerKitとの大きな違いはData型を渡す前提で作っているところです。

データ送るとき

let data: Data = try! JSONEncoder().encode(message)
BeerKit.sendEvent("message", data: data)

PeerKitはAny型を渡すように作られているのですが、これが少し罠で、中でNSKeyedArchiverでアーカイブされてDataになるので、NSCodingに準拠している型じゃないとダメで、準拠してない型を渡すとクラッシュします。

だったら最初からData型を渡すようにしようということで、作り直しました。

データ受け取るとき

BeerKit.onEvent { (peerId, event, data) in
    guard let data = data,
        let message = try? JSONDecoder().decode(MessageEntity.self, from: data) else {
            return
    }
    self.messages.append(message)

    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

JSONにして送受信することを想定してデモアプリはつくられています。

まとめ

ということで、もし良ければBeerKit使ってみてくださいー!何かあればPRもお待ちしています。

あと、⭐️もお待ちしてます。

https://github.com/kboy-silvergym/BeerKit

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

テストコードとログの記事掲載の仕方について

はじめに

過去の 記事1 記事2 で、テストコードとログについての記事上の可読性を検証してきた。
本記事ではその内容を統合し、今後の記事の「記載内容の読み方」リンクを受けるページとして機能することを目的する。

原文まま

実コード
func getElements(elements: Int, array: [Int]) -> [Int] {
    let cnt = round(target: elements, min: 0, max: array.count)
    return [ Int ](array[0..<cnt])
}
テストコード
class FuncTests : XCTestCase {
    func testGetElements() {
        XCTAssertEqual( getElements(elements: -1, array: [1,3,5,7,9]), [],          "取出個数 下限値未満")
        XCTAssertEqual( getElements(elements:  0, array: [1,3,5,7,9]), [],          "取出個数 下限値未満")
        XCTAssertEqual( getElements(elements:  1, array: [1,3,5,7,9]), [1],         "取出個数 下限値")
        XCTAssertEqual( getElements(elements:  5, array: [1,3,5,7,9]), [1,3,5,7,9], "取出個数 上限値")
        XCTAssertEqual( getElements(elements:  6, array: [1,3,5,7,9]), [1,3,5,7,9], "取出個数 上限値超過")
        XCTAssertEqual( getElements(elements: -1, array: []), [],                   "取出個数 下限値未満")
        XCTAssertEqual( getElements(elements:  0, array: []), [],                   "取出個数 下限値未満")
        XCTAssertEqual( getElements(elements:  1, array: []), [],                   "取出個数 下限値")
        XCTAssertEqual( getElements(elements:  5, array: []), [],                   "取出個数 上限値")
        XCTAssertEqual( getElements(elements:  6, array: []), [],                   "取出個数 上限値超過")
    }
}
実行結果
Test Suite 'FuncTests' started at 2019-01-26 15:06:41.432
Test Case '-[__lldb_expr_27.FuncTests testGetElements]' started.
Test Case '-[__lldb_expr_27.FuncTests testGetElements]' passed (0.090 seconds).
Test Case '-[__lldb_expr_27.FuncTests testRound]' started.
Test Case '-[__lldb_expr_27.FuncTests testRound]' passed (0.001 seconds).
Test Suite 'FuncTests' passed at 2019-01-26 15:06:41.577.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.090 (0.145) seconds

可読性向上

実コード
func getElements(elements: Int, array: [Int]) -> [Int] {
    let cnt = round(target: elements, min: 0, max: array.count)
    return [ Int ](array[0..<cnt])
}
getElementsのテストコード(XCTAssertEqual比較)
(elements: -1, array: [1,3,5,7,9]), [],          "取出個数 下限値未満"
(elements:  0, array: [1,3,5,7,9]), [],          "取出個数 下限値未満"
(elements:  1, array: [1,3,5,7,9]), [1],         "取出個数 下限値"
(elements:  5, array: [1,3,5,7,9]), [1,3,5,7,9], "取出個数 上限値"
(elements:  6, array: [1,3,5,7,9]), [1,3,5,7,9], "取出個数 上限値超過"
(elements: -1, array: []), [],                   "取出個数 下限値未満"
(elements:  0, array: []), [],                   "取出個数 下限値未満"
(elements:  1, array: []), [],                   "取出個数 下限値"
(elements:  5, array: []), [],                   "取出個数 上限値"
(elements:  6, array: []), [],                   "取出個数 上限値超過"
実行結果
0 failures
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む