[swift] Swift 함수의 기본 선택적 매개 변수

firstThing기본값으로 설정 하면 기본값 nilnil없으면 함수를 호출 할 때 매개 변수가 없다는 오류가 발생합니다.

입력 Int?하면 기본값 인으로 선택 사항이라고 생각 nil했습니다. 맞습니까? 그렇다면 왜 = nil? 없이는 작동하지 않습니다 .

func test(firstThing: Int? = nil) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}
test()



답변

옵션과 기본 매개 변수는 서로 다른 두 가지입니다.

옵션이 될 수있는 변수 nil를입니다.

기본 매개 변수는 해당 매개 변수를 생략 할 때 기본값을 사용합니다 .이 기본값은 다음과 같이 지정됩니다.func test(param: Int = 0)

선택적 매개 변수를 지정하는 경우 전달하려는 값이 인 경우에도이를 제공해야합니다 nil. 함수가 이와 같이 보이면 다음과 같이 func test(param: Int?)호출 할 수 없습니다 test(). 매개 변수는 선택 사항이지만 기본값이 없습니다.

또한 두 가지를 결합하고 다음과 nil같이 기본값 인 위치를 선택적으로 취하는 매개 변수를 가질 수 있습니다 func test(param: Int? = nil)..


답변

기본 인수를 사용하면 인수를 전달하지 않고 함수를 호출 할 수 있습니다. 인수를 전달하지 않으면 기본 인수가 제공됩니다. 따라서 코드를 사용하면이 …

test()

… 다음과 정확히 동일합니다.

test(nil)

이와 같이 기본 인수를 생략하면 …

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

… 그러면 더 이상 할 수 없습니다 …

test()

그렇게하면 설명했던 “인수 누락”오류가 발생합니다. 인수가 nil다음 과 같더라도 매번 인수를 전달해야합니다 .

test(nil)   // this works


답변

Swift는 매개 변수를 전달하지 않고 함수를 호출 할 수 있으며 여전히 호출되는 JavaScript와 같은 언어와 다릅니다. 따라서 Swift에서 함수를 호출 하려면 매개 변수에 값을 할당 해야 합니다.

매개 변수의 기본값을 사용하면 함수를 호출 할 때 값을 지정하지 않고도 값을 지정할 수 있습니다. 그렇기 때문에 test()테스트 선언에 기본값을 지정할 때 작동합니다.

해당 기본값을 포함하지 않으면 호출시 값을 제공해야합니다 test(nil)..

또한,이 질문과 직접적으로 관련이 없지만, 아마 주목할 가치가있을 것입니다. 당신은 Swift에서 가능한 nil 옵션을 다루기 위해 null 포인터를 다루는 “C ++”방식을 사용하고 있습니다. 다음 코드는 더 안전하며 (특히 멀티 스레딩 소프트웨어에서) 선택 사항의 강제 언 래핑을 방지 할 수 있습니다.

func test(firstThing: Int? = nil) {
    if let firstThing = firstThing {
        print(firstThing)
    }
    print("done")
}
test()


답변

당신은 Optional기본값을 갖는 것과 합동 하고 있습니다. An Optional은 값 또는 nil을 허용합니다. 기본값이 있으면 함수를 호출 할 때 인수를 생략 할 수 있습니다. 인수는 Optional유형 유무에 관계없이 기본값을 가질 수 있습니다 .

func someFunc(param1: String?,
          param2: String = "default value",
          param3: String? = "also has default value") {
    print("param1 = \(param1)")

    print("param2 = \(param2)")

    print("param3 = \(param3)")
}

출력이있는 호출 예 :

someFunc(param1: nil, param2: "specific value", param3: "also specific value")

param1 = nil
param2 = specific value
param3 = Optional("also specific value")

someFunc(param1: "has a value")

param1 = Optional("has a value")
param2 = default value
param3 = Optional("also has default value")

someFunc(param1: nil, param3: nil)

param1 = nil
param2 = default value
param3 = nil

요약:

  • ? (예 : String?)은 Optionalnil이거나 Type의 인스턴스를 포함 할 수 있습니다.
  • 기본값이있는 인수는 함수 호출에서 생략 될 수 있으며 기본값이 사용됩니다.
  • Optional및 둘 다 기본값이있는 경우 함수 호출에서 생략하거나 포함 할 수 있으며 nil 값으로 제공 할 수 있습니다 (예 : param1 : nil).

답변

“선택적 매개 변수”는 “이 매개 변수의 유형은 선택 사항입니다”를 의미합니다. “이 매개 변수는 선택 사항이므로 함수를 호출 할 때 무시할 수 있습니다”를 의미하지는 않습니다.

“선택적 매개 변수”라는 용어가 혼란스러워 보입니다. 명확히하기 위해 “선택적 매개 변수”대신 “선택적 유형 매개 변수”라고 말하는 것이 더 정확합니다. 여기서 “선택적”이라는 단어는 매개 변수 값의 유형을 설명하기위한 것일뿐 다른 것은 설명하지 않습니다.


답변

bool 매개 변수를 사용해야하는 경우 기본값을 지정하기 만하면됩니다.

func test(WithFlag flag: Bool = false){.....}

그런 다음 매개 변수없이 또는 매개 변수와 함께 사용할 수 있습니다.

test() //here flag automatically has the default value: false
test(WithFlag: true) //here flag has the value: true


답변

func매개 변수를 사용하거나 사용하지 않고 를 호출 할 수 있도록 func하려면 다른 이름을 호출하는 동일한 이름 의 두 번째 를 만들 수 있습니다 .

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

func test() {
    test(firstThing: nil)
}

이제 test매개 변수없이 또는 매개 변수없이 이름이 지정된 함수를 호출 할 수 있습니다 .

// both work
test()
test(firstThing: 5)