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


107

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

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

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

1
func test(firstThing: Int = 4)다음 Optional과 같이 쓸 수 있다는 것을 고려하십시오 : 기본값이 있는 비 매개 변수. Optional(무엇 인 유형 ?에 형명에 펼쳐지는) 값 형식이고; "선택적 매개 변수"는 유형에 관계없이 함수 호출에있을 수도 있고 없을 수도있는 매개 변수의 불행한 이름입니다.
zneak

이 코드를 테스트하기 위해 어떤 버전의 Swift를 사용 했습니까? 코드가 잘 작동합니다 !! 선택 사항은 유형일 뿐이며 기본 매개 변수는 Swift의 다른 유형과 마찬가지로 잘 작동합니다
Victor Sigler

답변:


210

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

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

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

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

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


27
"선택 사항 인 매개 변수를 지정하는 경우이를 제공해야합니다." 좋아요, 감사 스위프트
andrewtweber

8
@andrewtweber 당신의 유머는 높이 평가되지만, 초보자들에게는 "선택 사항"이 물건이나 가치를 제공하는 것을 의미한다는 것을 명확히하는 것이 도움이 될 것이라고 생각했습니다. 그렇게 할 필요는 없으며 대신 nil (객체 또는 값이 없음을 나타냄)을 제공 할 수 있습니다. 어떤 옵션을 선택할지 결정하기 만하면됩니다.
JD Sandifer

23

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

test()

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

test(nil)

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

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

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

test()

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

test(nil)   // this works

18

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

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

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

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

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

7

당신은 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).

기본 매개 변수를 let 또는 var와 같은 변수로 추가 할 수 있습니까? 감사합니다
Yogesh Patel

@YogeshPatel 무슨 뜻인지 잘 모르겠습니다.
Chuck Krutsinger

var myName = "Yogesh"처럼. 이제 내 함수는 1과 같습니다. func getFilterNames (name : string = myName) {}이 접근 방식은 저에게 적합하지 않습니다. 2. func getFilterNames (name : string = "Yogesh") {}이 접근 방식은 저에게 효과적입니다. 그러나 나는 첫 번째를 원하므로 이것을 달성하도록 도와주세요. 감사합니다!
Yogesh Patel

@YogeshPatel 당신이 원하는 것은 func getFilterNames(name: inout String){ }전달 된 이름을 수정할 수 있다는 것입니다.
Chuck Krutsinger

아닙니다. 매개 변수를 수정하고 싶지 않습니다. 내 매개 변수에 기본값을 제공하고 싶지만 정적 "Yogesh"와는 다릅니다. 나는 let name = "Yogesh"dynamic func getFilterNames (name : string = name)처럼하고 싶습니다. 이 선생님을 받고? 감사!
Yogesh Patel

3

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

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


3

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

이것을 반대하는 사람들의 경우 대신 잘못된 것을 수정할 수 있으므로 다른 사람들이 이해할 수 있습니다.
Niib Fouda 2018

0

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)

매개 변수의 기본값으로 nil을 지정할 수 있는데 왜 추가 함수를 정의합니까?
Peter Schorn

-1

선택적 매개 변수와 해당 매개 변수에 대한 기본값을 결합하려고 할 때 약간 까다 롭습니다. 이렇게

func test(param: Int? = nil)

이 두 가지는 완전히 반대되는 생각입니다. 선택적 유형 매개 변수가 있지만 여기에 기본값도 제공하는 경우 기본값이 있으므로 더 이상 선택적 유형이 아닙니다. 기본값이 nil 인 경우에도 swift는 기본값이 무엇인지 확인하지 않고 선택적 바인딩을 제거합니다.

따라서 항상 nil을 기본값으로 사용하지 않는 것이 좋습니다.


1
이것은 올바르지 않습니다. 선택 사항이 기본값 (심지어 nil)을 갖는 것은 잘못된 것이 아닙니다 .
Brian

내가 말하고있는 것은 변수에 기본값이 있으면 항상 값이 있다는 점에서 선택 사항이 아니라는 것입니다.
Shubham Naik

1
그것은 사실이 아니며, 당신이 무엇을 설명하려고하는지 잘 모르겠습니다. 변수에 할당 된 값이 있으면 항상 할당된다고 올바르게 말하는 것 같습니다. 할당을 취소하지 않는 한 할당을 취소 할 수 없습니다 (원하지도 않음). 그리고 Swift는 값을 가지기 전에 변수를 사용하려고하면 컴파일 오류가 발생합니다 (에서와 같이 var foo: String; print(foo)). 그러나 기본값이있는 함수 인수는 선택적 인수이며 (함수 호출에서 전달할 필요가 없음) 선택적 유형일 수도 있습니다 ( nil기본값으로도 할당 할 수 있음).
Brian Kendig

Optional은 본질적으로 <Type | Nil>, 즉 Specified type 또는 Nil Type을 가질 수 있습니다. (스위프트에 Unions가 있다고 가정하지만 여기서는 개념적으로 이야기하고 있습니다). 그래서 Int? = nil은 완벽합니다.
Shayne 2019

-1

기본값은 데이터 타입의 기본값을 의미하지 않으며, 여기서 기본값은 함수 정의시 정의 된 값을 의미합니다. 함수에서 변수를 정의하는 동안 변수의 기본값을 선언해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.