3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Swiftの記号あれこれ

Last updated at Posted at 2020-02-11

#背景
Swiftの公式ドキュメント、ヘルプガイド、ブログのコードサンプルなどによく出てくる実装のなかで、どんな意味があるのかすぐに判断できない記述がありました。
メソッドの引数が顔文字化していたり(例えば、max(:_:_)とか)、変数定義の型の最後にに?!が付いていたりと、あれ?これはどういう意味だったかなというときに自分自身がすぐに思い出すとき用の記事があるといいなぁと思い記事にしました。

#対象とする読者
Swift初心者

#環境
私がこの記事を書いている際に利用しているのは次の環境です。
Xcode 11.3.1
Swift 5.0

#Swiftの記号あれこれ

###関数の引数に出現する_ (アンダースコア)

Swiftでは関数の引数にラベルをあらかじめ付けておき、利用者にそれを明確に指定させることができるが、名前をわざわざ指定しなくても明らかにわかる場合は、その仕組みだとコードが読みにくくなってしまいます。
なので、関数呼び出しするときの引数が、名前なしで渡せますよということを明示するもの。

// 引数に名前付きで呼び出してもらう関数の書き方
func add(x: Int, y: Int) -> Int {
    return x + y
}
var r1 = add(x: 3, y: 2)  // 5: OK
var r2 = add(3, 2)        // NG(引数に名前がないのでコンパイルエラー)


// 引数に名前なしで呼び出してもらう関数の書き方
func addByNoLabel(_ x: Int, _ y: Int) -> Int { 
    return x + y
}
var r3 = add(4, 7)        // 11: 引数に名前なしでOK

関数のシグネチャーで、
func(_:)とかfunc(_:_:)とかの表現を見かけたときは、_:のところに、名前なしで引数を入れれば利用できるんだな、ぐらいで見ておけばよいです。

###型のうしろに?(はてな)
?
通称:はてなマーク
正式名:クエスチョンマーク

値がオプショナル型であることを示す場合に利用します。オプショナル型は、指定した型の値もしくは値そのものがないnilのいずれかを表す型です。
Optional<Wrapped> (WrappedにはInt,Stringなど実際の型が入る)が入りますが、コードが冗長となるのを避けるためのシュガーシンタックスとして用意されています。

// 正式な構文だと
var age: Optional<Int>

// 簡潔に書くと
var age: Int? = 21

// 利用時には、アンラップが必要(強制アンラップした場合)
var nextAge :Int = age! + 1   // 22: オプショナルの値に!を付けて強制アンラップ

変数等の後ろに?が出現した場合は、この変数は空っぽの状態(nil)もあり得るということと、Optionalを解除(Wrap包み紙から出してあげるイメージ)しないと、元の型としては利用できないという認識を持っておけばよいです。

###型のうしろに!(びっくり)

!
通称:びっくりマーク
正式名:エクスクラメーションマーク

こちらもオプショナル型ですが、?とは異なり!で定義した値にアクセスする際には自動的に強制アンラップして元の型にしてくれます。なので「暗黙的にアンラップされたOptional<Wrapped>型」と呼ばれています。
型としては、Optional<Wrapped>型だけど、利用するときには通常のWrapped型として利用可能。
注意点としては、値にアクセスしたときにnilだった場合は、実行時エラーとなってしまいます。

var age: Int! = 21

//アクセス時に自動的に強制アンラップしてくれる
var nextAge: Int = age + 1   // 22

###範囲演算子(終了を含まない)

a..<b
aから始まり、終了bを含まない範囲。

var range 1..<4   // CountableRange(1..<4) 

for value in range {
    print(value)
}

実行結果
1
2
3

###範囲演算子(終了を含む)

a...b
aから始まり、終了bを含む範囲。

var range 1...4   // CountableClosedRange(1...4) 

for value in range {
    print(value)
}

実行結果
1
2
3
4

#さいごに

慣れない言語でのコーディングは不安です。
でも、知ってしまえば、慣れてしまえばそれほど難しくないことは多々あります。
私も今回のこの記事を自分で整理してアウトプットすることで、頭の中を整理できました。
私のようなSwift初心者の方に、この記事が少しでも役立てば幸いです。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?