- 投稿日:2019-10-23T17:42:58+09:00
Swiftではnamespaceとしてcaseなしenumが使える
こういうメリットがあるよ
// classやstructをnamespaceがわりに使ったとき、 class C1 { static func xxx() {} } // C1をインスタンスとして使いたくないのに、C1のインスタンスを作れてしまう let c1 = C1()class C2 { static func xxx() {} // こうやってイニシャライザを外から呼べないように殺せば、 private init() {} } // たしかにインスタンス化を防ぐのは可能 let c2 = C2() // ⛔️'C2' initializer is inaccessible due to 'private' protection level // だが…こういう引数を書けてしまうことは避けられない func doSomething(c2: C2) { print("c2のインスタンスを期待する処理") }enum E { static func xxx() {} // caseなしenumならイニシャライザをprivateにして殺す必要もないし、 } // コンパイラが「eのインスタンスなんてないよ」と警告してくれる func doSomething(e: E) { print("eのインスタンスを期待する処理") // ⚠️Will never be executed }?列挙しないenumって……トリッキーすぎない?
否。
そう感じられるかもしれませんが、実はStandard Libraryでも活用されてるんですよ。
なので、enumがnamespaceになりうるというのはお墨付きです。例:
https://developer.apple.com/documentation/combine/publishers
A namespace for types that serve as publishers.
enum Publishershttps://developer.apple.com/documentation/swift/unicode
A namespace for Unicode utilities.
@frozen enum Unicode?
namespaceキーワードとか導入して明確に区別できればいいんじゃない?ワイトもそう思います。
Swift Forumsでも議論はされているのが見当たるんですが……
でもnamespaceのメンバはstaticつけるのかつけないのか、submodule導入するアプローチはどうか、いやそれは別物で、とか色々論点が出てきて、今は議論が止まっちゃってるみたいに見えます。https://forums.swift.org/t/namespace-keyword/11338
https://forums.swift.org/t/namespaces-x-submodules/11673となれば、まあcaseなしenumは現実解としては必要十分じゃないでしょうか。
- 投稿日:2019-10-23T16:41:15+09:00
OpenCV + iOS (Swift) + CvVideoCamera: サンプル
はじめに
OpenCV を Swfit で書いたアプリに組み込んで、カメラで撮影した画像をリアルタイムに画像処理して表示するサンプルアプリを作ってみました。
背景
OpenCV を iOS で使うには、 OpenCV から公式配布されている
opencv2.frameworkをプロジェクトに組み込めば容易に使えます。しかし、 OpenCV は C++ のライブラリなので、 iOS で使うには Objective-C++ を書かなければいけません!
もっぱら最近の iOS アプリは、 Swift で書かれていると思います。
Swift から Objective-C++ を使うにはブリッジファイルを用意する必要があります。ソースコード
GitHub で公開しています。
https://github.com/kulikala/ios-opencv-skeletonローカルにクローンして使ってください。
git clone git@github.com:kulikala/ios-opencv-skeleton.git cd ios-opencv-skeletonCocoaPods
OpenCV のフレームワークを Xcode プロジェクトに取り込む方法として、 Carthage や SwiftPM などがありますが、オールドクラシックに
Podfileを使う方法にしています。pod install開くときには、 CocoaPods が作成する
OpenCVSkeleton.xcworkspaceを開いてください。open OpenCVSkeleton.xcworkspace
- 投稿日:2019-10-23T14:56:03+09:00