※この記事はSwift by Sundellの内容を日本語に翻訳したものです。
Swift 5.4の新機能:
self
を使って手動で明確にすることなく、同じ名前の式に割り当てられるローカル変数を作成できるようになりました。
たとえば、次のItemListViewController
には、単にitem(at :)
を呼び出すように選択した特定のIndexPath
のアイテムを取得できるメソッドがあります。
class ItemListViewController: UIViewController {
...
private func item(at indexPath: IndexPath) -> Item {
...
}
}
Swift 5.3以前を使用しているときに、上記のメソッドを呼び出して、その結果をitem
とも呼ばれるローカルのlet
またはvar
に割り当てる場合、コンパイラーが使用できるようにするには、メソッド呼び出しの前にself
を付ける必要があります。 2つを分けるには—次のように:
class ItemListViewController: UIViewController {
...
private func showDetailViewForItem(at indexPath: IndexPath) {
let item = self.item(at: indexPath)
...
}
}
ただし、Swift 5.4以降、これは不要になり、コンパイラは、self
を使用して参照するかどうかに関係なく、右側のアイテムシンボルがメソッドの呼び出しを参照していることを自動的に認識します。
class ItemListViewController: UIViewController {
...
private func showDetailViewForItem(at indexPath: IndexPath) {
let item = item(at: indexPath)
...
}
}
おそらく、この新しい構文機能を使用する私のお気に入りの方法は、非同期コードの単体テストを作成するときです。これには通常、組み込みのexpectation
APIを使用してXCTestExpectation
インスタンスを作成することが含まれます。このような期待の最も自然な名前は単にexpectation
であることが多いため、次のことができるようになったのは本当に素晴らしいことです。
class ItemLoaderTests: XCTestCase {
...
func testLoadingItem() {
let expectation = expectation(description: "Loading item")
...
}
}
上記の機能が役立つもう1つのタイプの状況は、プロパティのローカルで変更可能なコピーを作成する場合です。これは、コピーするプロパティを参照するときにself
を使用せずに実行できるようになりました。たとえば、次のようになります。
struct Item {
var title: String
var prefix: String?
var suffix: String?
func fullTitle() -> String {
var title = title // 従来は var title = self.title
if let prefix = prefix {
title = prefix + title
}
if let suffix = suffix {
title += suffix
}
return title
}
}
確かに、これはSwiftコードの記述方法を完全に変える革新的な新しい構文機能ではないかもしれませんが、すべての機能や変更が必要なわけではありません。個人的には、このような「生活の質」の向上は非常に歓迎されており、特定の種類のコードをかなり軽量に感じさせることができると思います。
元の記事
Assigning an expression to a variable with the same name Swift by Sundell