- 投稿日:2020-08-01T20:59:14+09:00
【Unity】Macでバージョン管理ができる? SnailSVNを解説
これまでWindowsで利用していたリポジトリをMacで利用する必要が出てきたので
今回はMacでSubversion利用するためのソフトの紹介や設定方法
Windowsリポジトリをチェックアウトするところまでを解説したいと思います。本文はこちらです。
https://tedenglish.site/how-to-manage-unity-project-svnmac/
- 投稿日:2020-08-01T09:17:01+09:00
【Mac】MacのOSアップデートを実施する
MacOSを最新版にする
WindowsUpdateと同じくMacもしっかりとバージョンアップしておかないとね。
インターネットに接続できたら最初に実施しましょう。現状のバージョンを把握する
まずは現状のバージョン把握を行いますかね。
[アップルマーク(っていうのかな?)] - [このMacについて] をクリックします。
[システムレポート...]をクリックして、関係しそうなところを確認してみましょう。
ソフトウェアが関係しそうなので確保しました。
アップデートを実施する
先ほどの画面の[ソフトウェア・アップデート...]をクリックします。
アップデートがあることが表示されるので、[今すぐアップデート]をクリックします。
[Macを自動的に最新の状態に保つ]のチェックを有効にするかどうかは任意ですよねー。
今回は個人で勉強がてら利用するつもりなのでアップデートも意識しながら作業したい。
そんなわけでチェックはつけずにすすめることにします。始まりそうな問いかけがきました。
[ダウンロードして再起動]をクリックするとアップデートが始まります。時間がそこそこかかるので別作業していると、OS再起動する瞬間を見逃しました(笑)
最新のバージョンを確認する
改めてバージョン情報を確認してみましょう。
あがってますね。
項目 アップデート前 アップデート後 システムのバージョン macOS 10.15.1(19888) macOS 10.15.6(19G73) カーネルのバージョン Darwin 19.0.0 Darwin 19.6.0 他に確認すべき項目があるのかしら?気づけば追々追加しましょうかね。
お疲れ様でした。
2020-08-01 初稿
- 投稿日:2020-08-01T02:52:55+09:00
【Swift】ゼロからのCombineフレームワーク - とりあえずViewにデータバインディングしたいための人の最小実装
意外と難しかったCombine
RxSwiftならある程度使えるし、簡単に使えるようになるかな?と思っていました。
しかし、いざ試してみるとなかなか苦労したので、まずは普段の開発に取り入れられる部分から切り出してみました。Viewに値をバインドする最小実装 UIKit版
import Combine import UIKit class ViewModel { @Published var labelText: String = "Default value." } class ViewController: UIViewController { var label: UILabel! // 適当な場所(storyboard, viewDidLoadなど)で初期化する let viewModel = ViewModel() private var cancellables = Set<AnyCancellable>() override func viewDidLoad() { super.viewDidLoad() viewModel.$labelText .map({ Optional($0) }) .receive(on: DispatchQueue.main) .assign(to: \UILabel.text, on: label) .store(in: &cancellables) } }適当なタイミングで、
viewModel.labelText = "Hello!"
などと値を変更すると、自動的にUILabel
が更新されます。解説
@Published
とPublisher
プロトコルバインドしたいプロパティの変更を監視するために、
import Combine
したうえで、@Published
というProperty Wrapperをバインドしたいプロパティに付与します。ViewModelclass ViewModel { @Published var labelText: String = "Default value." }Property Wrapperを付与したプロパティをもつクラスには、自動的に
$labelText
のようにプロパティ名の先頭に$
がついたgetterが生成されます。@Published
を付与した場合、このgetterはPublished<Output>.Publisher
型になります。
Publisher
というのが監視される側のプロトコルです(RxSwiftならObservable
)。また、この場合Output = String
です。バインド
Publisher
に準拠したプロパティをUIView
にバインドするには、assign
メソッドを使います。viewModel.$labelText .map({ Optional($0) }) .receive(on: DispatchQueue.main) .assign(to: \UILabel.text, on: label) .store(in: &cancellables)
assign
assign
メソッドの定義は次のようになっています。public func assign<Root>(to keyPath: ReferenceWritableKeyPath<Root, Self.Output>, on object: Root) -> AnyCancellable
keyPath
には\UILabel.text
1のようにバインド先のUIView
の型名とそのプロパティ名を記載します。
assign
メソッドはAnyCancellable
というCancellable
プロトコルに準拠したクラスのインスタンスを返します。このインスタンスのcancel
メソッドを呼ぶことでバインド(監視)が解除されます。また、
AnyCancellable
のインスタンスはメモリから解放されるタイミングでもcancel
メソッドを呼んでバインドを解除するようです2。そのため、ViewController
にSet<AnyCancellable>
型のプロパティを持たせて参照を保持します。追加する際にチェーンでメソッドを呼べるようにstore
メソッドが用意されています。
map
Publisher
には様々なオペレーターが用意されており、監視している値に変更を加えたり、流れてくる時間や回数などの条件によって流れをせきとめたりすることができます。
map
はもっとも基本的なオペレーターで、流れてきた値を加工することができます。
ここでは、UILabel.text: String?
の型に合わせて、ViewModel.labelText: String
をOptional
型に変換しています。
receive(on: DispatchQueue.main)
receive(on:)
はメソッドチェーンのうちで、このメソッド以降のチェーン内の処理が行われるスレッドを指定することができます。
assign
メソッドはUIの更新処理にあたるので、メインスレッドを指定しています。Viewに値をバインドする最小実装 SwiftUI版
import Combine import SwiftUI class ViewModel: ObservableObject { @Published var labelText: String = "" } struct ContentView: View { @ObservedObject private var viewModel = ViewModel() var body: some View { NavigationView { VStack { Text(viewModel.labelText) TextField("Title", text: $viewModel.labelText) .multilineTextAlignment(.center) } } } }解説
@ObservedObject
/ObservableObject
SwiftUIのViewにバインドするには、バインドしたいプロパティをもつ
viewModel
に@ObservedObject
を付与します。
(ObservableObject
プロトコルに準拠させることで、@ObservedObject
が付与できるようになります。)struct ContentView: View { @ObservedObject private var viewModel = ViewModel() ... } class ViewModel: ObservableObject { @Published var labelText: String = "" }バインド
var body: some View { NavigationView { VStack { Text(viewModel.labelText) TextField("Title", text: $viewModel.labelText) .multilineTextAlignment(.center) } } }
@ObservedObject
を付与したプロパティはView
に監視されるようになり、値の変更があればUIが自動更新されます。
そのため、通常のString
型を引数にとるクラスではviewModel.labelText
を渡すだけでバインド完了です。
@ObservedObject
によって生成された$viewModel
プロパティのlabelText
はBinding<String>
という型を返します。これをBinding<String>
型を引数にとるTextFieldに渡すことによって、双方向バインディングとなります。こちらのSwiftUI版では、
viewModel.labelText
の値を変更するとText
とTextField
の値が更新されますし、キーボードからTextField
を変更しても、viewModel.labelText
(とText
)の値が更新されます。
バックスラッシュはKey-Pathを表現するときの記法です。ドキュメントはこちら Key-Path Expression ↩
ドキュメントに記述を見つけられなかったのですが、参照を保持しなかった場合は
viewDidLoad
を抜けた時点でcancel
が呼ばれていました。 ↩
- 投稿日:2020-08-01T02:52:55+09:00
【Swift】ゼロからのCombineフレームワーク - UIKitでデータバインディング
意外と難しかったCombine
RxSwiftならある程度使えるし、簡単に使えるようになるかな?と思っていました。
しかし、いざ試してみるとなかなか苦労したので、まずは普段の開発に取り入れられる部分から切り出してみました。UIKitに値をバインドする
import Combine import UIKit class ViewModel { @Published var labelText: String = "Default value." } class ViewController: UIViewController { var label: UILabel! // 適当な場所(storyboard, viewDidLoadなど)で初期化する let viewModel = ViewModel() private var cancellables = Set<AnyCancellable>() override func viewDidLoad() { super.viewDidLoad() viewModel.$labelText .map({ Optional($0) }) .receive(on: DispatchQueue.main) .assign(to: \UILabel.text, on: label) .store(in: &cancellables) } }適当なタイミングで、
viewModel.labelText = "Hello!"
などと値を変更すると、自動的にUILabel
が更新されます。解説
@Published
とPublisher
プロトコルバインドしたいプロパティの変更を監視するために、
import Combine
したうえで、@Published
というProperty Wrapperをバインドしたいプロパティに付与します。ViewModelclass ViewModel { @Published var labelText: String = "Default value." }Property Wrapperを付与したプロパティをもつクラスには、自動的に
$labelText
のようにプロパティ名の先頭に$
がついたgetterが生成されます。@Published
を付与した場合、このgetterはPublished<Output>.Publisher
型になります。
Publisher
というのが監視される側のプロトコルです(RxSwiftならObservable
)。また、この場合Output = String
です。バインド
Publisher
に準拠したプロパティをUIView
にバインドするには、assign
メソッドを使います。viewModel.$labelText .map({ Optional($0) }) .receive(on: DispatchQueue.main) .assign(to: \UILabel.text, on: label) .store(in: &cancellables)
assign
assign
メソッドの定義は次のようになっています。public func assign<Root>(to keyPath: ReferenceWritableKeyPath<Root, Self.Output>, on object: Root) -> AnyCancellable
keyPath
には\UILabel.text
1のようにバインド先のUIView
の型名とそのプロパティ名を記載します。
assign
メソッドはAnyCancellable
というCancellable
プロトコルに準拠したクラスのインスタンスを返します。このインスタンスのcancel
メソッドを呼ぶことでバインド(監視)が解除されます。また、
AnyCancellable
のインスタンスはメモリから解放されるタイミングでもcancel
メソッドを呼んでバインドを解除するようです2。そのため、ViewController
にSet<AnyCancellable>
型のプロパティを持たせて参照を保持します。追加する際にチェーンでメソッドを呼べるようにstore
メソッドが用意されています。
map
Publisher
には様々なオペレーターが用意されており、監視している値に変更を加えたり、流れてくる時間や回数などの条件によって流れをせきとめたりすることができます。
map
はもっとも基本的なオペレーターで、流れてきた値を加工することができます。
ここでは、UILabel.text: String?
の型に合わせて、ViewModel.labelText: String
をOptional
型に変換しています。
receive(on: DispatchQueue.main)
receive(on:)
はメソッドチェーンのうちで、このメソッド以降のチェーン内の処理が行われるスレッドを指定することができます。
assign
メソッドはUIの更新処理にあたるので、メインスレッドを指定しています。おまけ:SwiftUI版
import Combine import SwiftUI class ViewModel: ObservableObject { @Published var labelText: String = "" } struct ContentView: View { @ObservedObject private var viewModel = ViewModel() var body: some View { NavigationView { VStack { Text(viewModel.labelText) TextField("Title", text: $viewModel.labelText) .multilineTextAlignment(.center) } } } }解説
@ObservedObject
/ObservableObject
SwiftUIのViewにバインドするには、バインドしたいプロパティをもつ
viewModel
に@ObservedObject
を付与します。
(ObservableObject
プロトコルに準拠させることで、@ObservedObject
が付与できるようになります。)struct ContentView: View { @ObservedObject private var viewModel = ViewModel() ... } class ViewModel: ObservableObject { @Published var labelText: String = "" }バインド
var body: some View { NavigationView { VStack { Text(viewModel.labelText) TextField("Title", text: $viewModel.labelText) .multilineTextAlignment(.center) } } }
@ObservedObject
を付与したプロパティはView
に監視されるようになり、値の変更があればUIが自動更新されます。
そのため、通常のString
型を引数にとるクラスではviewModel.labelText
を渡すだけでバインド完了です。
@ObservedObject
によって生成された$viewModel
プロパティのlabelText
はBinding<String>
という型を返します。これをBinding<String>
型を引数にとるTextFieldに渡すことによって、双方向バインディングとなります。こちらのSwiftUI版では、
viewModel.labelText
の値を変更するとText
とTextField
の値が更新されますし、キーボードからTextField
を変更しても、viewModel.labelText
(とText
)の値が更新されます。
バックスラッシュはKey-Pathを表現するときの記法です。ドキュメントはこちら Key-Path Expression ↩
ドキュメントに記述を見つけられなかったのですが、参照を保持しなかった場合は
viewDidLoad
を抜けた時点でcancel
が呼ばれていました。 ↩