LoginSignup
1
1

More than 5 years have passed since last update.

[swift][メモ]funcの引数のスコープとfuncの中身のスコープの違い

Last updated at Posted at 2016-05-30

初歩的なことだけど疑問点メモ。下記のような関数があるとする

func show(message: String?) {
    guard let message = message else { 
        return
    }
    print(message)
}

これはよくある記述と思うが、なぜ引数と同じ名前が定義出来るか不思議に感じた。引数はletとして扱われているはず。
当初はguard let(もしくはif let)はそういう挙動をすると思ったが、下記の様な記述でも動く。

func show(message: String) {
    let message = "Hello " + message 
    print(message)
}

これは、引数の部分とfuncの中でスコープが異なるということを意味している?c++等ではそういう挙動にならないがswiftはそういうものなんだろうか

void show(const char * message){
    const char * message = "foo";//error: redefinition of 'message'
    std::cout << message << std::endl;
}

Scalaで試したらエラーになった。これは、messageが未定義なのにmessageを呼んでる的なエラーかな?


def show(message: String) = {
    val message:String = "Hello" + message//エラー error: forward reference extends over definition of value message
    print(message) 
}

でも、下記のScalaコードは通る


def show(message: String) = {
    val message:String = "foo"
    print(message) 
}

またなんか発見があったら追記する。

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