20191023のSwiftに関する記事は3件です。

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 Publishers

https://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は現実解としては必要十分じゃないでしょうか。

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

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-skeleton

CocoaPods

OpenCV のフレームワークを Xcode プロジェクトに取り込む方法として、 Carthage や SwiftPM などがありますが、オールドクラシックに Podfile を使う方法にしています。

pod install

開くときには、 CocoaPods が作成する OpenCVSkeleton.xcworkspace を開いてください。

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

[swift] カスタムセルから親のcollectionViewとViewControllerの取得

カスタムセルから親にあたるコレクションビューとビューコントローラーを取得したかった

親子関係

ViewController
 |
 collectionView
  |
  customCell

方法

以下でOk

CustomCell.swift
let collectionView = (self.superview as! UICollectionView)
let iewController = ((self.superview as! UICollectionView).delegate as! ViewController)

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