【シンジ】戦略×エンジニア×Webデザイナー

Webコンサル、デザイン、サービス開発、経営に関することを呟きます。

Swift5.4の新機能についてまとめてみた!

f:id:Shinji0418s:20210226085655j:plain

どうも。株)WIREBASEの中村です。

 

本日は、現在プレビューリリース中のSwift5.4について綴りたいと思いますー。

Swift5.3がリリースされたのが2020年の9月16日なので、もの凄いスピード感で進化を遂げていますね。

 

そんな来たるSwift5.4。結局、何がどう変わるのか?

新しい機能を纏めていきたいと思います。


Xcodeの立上げ時

Xcodeのプロジェクトを経験した方なら知っていると思いますが、Xcodeのプロジェクトを立ち上げる時、"var str"と書きますよね。

var str = "Hello, playground"

 

Swift5.4では、それが "var greeting"となります。

var greeting = "Hello, playground"

 

➁複数の可変個引数パラメータが設定可能に!

以前のSwiftでは、下記コードの様に1つの可変個引数パラメータ―しかありませんでしたが、Swfit5.4では、functions, methods, subscripts, initializersの様に複数の可変長引数(variadic parameters)を設定することが可能になりました。

 

以前のSwift

func method(singleVariadicParameter: String) {}

 

Swift5.4

func method(multipleVariadicParameter: String...) {}

 

上記の関数で問題なく呼び出せるのですが、もちろんStringの配列要素は一つでも構いません。

method(multipleVariadicParameter: "Can", "Steve", "Bill")

 

複数の可変長引数は配列と同じようなの様に扱えるのですが、もちろんパラメーターで値を呼び起こすときは、その値が実際に存在するかなども含め事前にチェックしておく必要がありますね。下記のコードでチェックできます:

func chooseSecondPerson(persons: String...) -> String {
let index = 1
if persons.count > index {
return persons[index]
} else {
return "There is no second person."
}
}

 

③Result Builderの実装がより重要に!

SwiftUIが登場して以来、Builderの実装はかかせないものとなりつつありますが、Swift5.4ではそれがより顕著になりました。

 

みなさんもご存じの通り、result builderを使えば、Stringを出力する関数が複数あっても問題なかったですね。

 

@resultBuilder、で新しい構造体を定義することで新しいresult builderを定義できます。

 

それが、以下のresult builderを使うと、String配列の全要素を連結することができます。

@resultBuilder
struct StringBuilder {
static func buildBlock(_ strings: String...) -> String {
strings.joined(separator: "\n")
}
}

 

下記のコードでより詳細に説明しましょう。今迄はBuildBlockというメソッドを使って値を定義しなければならなかったため、string配列の各要素にカンマを入れなければなりませんでした。

let stringBlock = StringBuilder.buildBlock(
"It really inspires the",
"creative individual",
"to break free and start",
"something different."
)
print(stringBlock)

 

これからは、Stringbuilderという関数でカンマを入れずに値を定義できるようになりました。

@StringBuilder func makeSentence() -> String {
"It really inspires the"
"creative individual"
"to break free and start"
"something different."
}
print(makeSentence())

 

あまり大したことじゃないですが、他にもresult builderを使うことのメリットはたくさんあったりします。

 

例えば、result builderに2つの新しいメソッドを追加すると、様々なcondition (条件)を使ってString配列を生成できるようになりました。

@resultBuilder
struct ConditionalStringBuilder {
static func buildBlock(_ parts: String...) -> String {
parts.joined(separator: "\n")
}
static func buildEither(first component: String) -> String {
return component
}
static func buildEither(second component: String) -> String {
return component
}
}

 

以下の通り、if loopを用いて、ブール値に応じてString配列の要素を変更することもできたりします。

@ConditionalStringBuilder func makeSentence() -> String {
"It really inspires the"
"creative individual"
"to break free and start"
if Bool.random() {
"something different."
} else {
"thinking different."
}
}
print(makeSentence())

 

result builderで、他にもいろんなことができるので是非使いながら試してみてください。

 

 

④同じ名前の関数をいくつも定義できるようになった

同じ名前の関数を使いたいときってありません?あんまりないかな。( ´∀` )

Swift5.4だと下記コードでそれが可能になりました。

struct iPhone {}
struct iPad {}
struct Mac {}
func setUpAppleProducts() {
func setUp(product: iPhone) {
print("iPhone is bought")
}

func setUp(product: iPad) {
print("iPad is bought")
}

func setUp(product: Mac) {
print("Mac is bought")
}

setUp(product: iPhone())
setUp(product: iPad())
setUp(product: Mac())
}

 

 

まあ、書いてみるとマイナーチェンジな気がするのですが、使いようによっては役立つものもありそうです。

 

 

それでは、今日はこの辺で。

案件のご相談は、LINE/Twitterにてご相談お待ちしております。

 

株)WIREBASE中村LINE↓

友だち追加

株)WIREBASE中村Twitter