[objective-c] Swift References에서 _ 밑줄은 무엇입니까?

Apple 문서의 참조 섹션에는 이런 종류의 인스턴스가 많이 있습니다.

func runAction(_action: SKAction!)

이것의 Objective-C ‘등가’는 다음과 같습니다.

- (void)runAction:(SKAction *)action

(Swift 참조에서) 밑줄 뒤에 공백이 있고 “동작”이 이탤릭체로 쓰여지는 것이 중요하다는 사실을 알게되었습니다.

그러나 이것이 무엇을 전달하려고하는지 알 수 없습니다. 아마도 질문은 … 참고 문헌에 사용 된 규칙에 대한 참조가 있습니까?

-다음은 밑줄 사용에 대한이 참조에서 참조하는 페이지입니다.
https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction

최신 정보

Swift 3에서는 함수 / 메소드 매개 변수 이름과 인수 레이블의 사용 및 이름 지정 방식이 일부 변경되었습니다. 이것은이 질문과 그 대답에 영향을 미칩니다. @Rickster는 여기에서 많은 부분을 지우는 함수에서 _underscores에 대한 다른 질문에 대답하는 놀라운 일을합니다 .



답변

두 대답 모두 정확했지만 조금 더 명확하게하고 싶습니다.

_메소드의 외부 매개 변수 이름 동작수정 하는 데 사용됩니다 .

에서 로컬 및 방법에 대한 외부 매개 변수 이름 문서의 섹션은 말한다 :

Swift는 기본적으로 메소드 의 첫 번째 매개 변수 이름에 로컬 매개 변수 이름을 제공하고 기본적으로 두 번째 이후의 매개 변수 이름에 로컬 및 외부 매개 변수 이름 을 제공합니다.

반면 기본적으로 함수에는 외부 매개 변수 이름이 없습니다.

예를 들어,이 foo()메소드는 클래스에 정의되어 있습니다 Bar:

class Bar{
    func foo(s1: String, s2: String) -> String {
        return s1 + s2;
    }
}

당신이 전화하면 foo(), 같은 것 bar.foo("Hello", s2: "World")입니다.

그러나 , 당신은 사용하여이 동작을 무시할 수 있습니다 _앞에 s2가 선언 어디.

func foo(s1: String, _ s2: String) -> String{
    return s1 + s2;
}

그런 다음을 호출 하면 두 번째 매개 변수의 이름이없는 foo것처럼 간단하게 호출 될 수 있습니다 bar.foo("Hello", "World").

귀하의 경우로 돌아 가면 , 분명히 runActiontype과 관련되어 있기 때문에 방법 SKNode입니다. 따라서 _before 매개 변수를 action사용하면 runAction외부 이름없이 호출 할 수 있습니다 .

Swift 2.0 업데이트

함수 및 메소드는 이제 로컬 및 외부 인수 이름 선언 측면 에서 동일한 방식으로 작동 합니다 .

함수는 이제 기본적으로 2 번째 파라미터부터 외부 파라미터 이름을 사용하여 호출됩니다. 이 규칙은 순수한 Swift 코드에만 적용됩니다.

따라서 함수_ 앞에 함수 를 제공하면 호출자는 메서드에서 수행하는 것과 마찬가지로 외부 매개 변수 이름을 지정할 필요가 없습니다 .


답변

밑줄은 삭제 된 값을 나타내는 데 사용되는 일반 토큰입니다.

이 특정한 경우에는 함수가 runAction(argument)아닌 함수가 호출됨을 의미합니다.runAction(action:argument)

다른 상황에서는 다음과 같은 다른 유사한 의미를 갖습니다.

for _ in 0..<5 { ... }

즉, 블록을 5 회만 실행하고 블록 내의 인덱스는 신경 쓰지 않습니다.

이와 관련하여 :

let (result, _) = someFunctionThatReturnsATuple()

그것은 우리가 튜플의 두 번째 요소가 무엇인지 신경 쓰지 않고 첫 번째 요소 만 신경 쓰라는 것을 의미합니다.


답변

Swift 3부터 모든 인수 레이블이 기본적으로 필요합니다 .

IDE로 강제로 인수 레이블을 숨길 수 있습니다 _.

func foo(a: String) {
}

func foo2(_ a: String) {
}

전화 foo(a: "abc")foo2("abc")

참고 : 경우에만 사용할 수 a는 IS (외부) 인수 라벨(내부) 변수 명 을 동시에. 동일합니다- func foo(a a: String)수락하지 않습니다_ .

Apple에서 왜 사용하고 있습니까?

Apple이 API에서이를 사용하고 있음을 알 수 있습니다. Apple의 라이브러리는 여전히 Objective-C로 작성됩니다 (그렇지 않은 경우 Objective-C 구문을 위해 설계된 동일한 함수 이름을 공유 함)

함수 이름 에 이미 응용 프로그램 이 있기 때문에 함수 applicationWillResignActive(_ application: UIApplication)에는 중복 매개 변수 이름 이 있습니다 .application

당신의 예

func runAction(_ action: SKAction!)그것 없이 호출 됩니다_ 같은 마크runAction(action:) . 함수 이름에 이미 하나 있기 때문에 매개 변수 이름 action중복 됩니다. 그것이 목적과 그 이유입니다.


답변

매개 변수 선언 앞의 식별자는 외부 매개 변수 이름을 정의합니다 . 함수를 호출 할 때 호출자가 제공해야하는 이름입니다.

func someFunction(externalParameterName localParameterName: Int)

외부 이름을 직접 제공하지 않으면 Swift는 사용자가 정의한 기본 매개 변수의 자동 외부 이름을 제공합니다. 외부 매개 변수 이름에 밑줄을 사용하면이 동작에서 제외됩니다.

_매개 변수를 정의 할 때 명시적인 외부 이름 대신 밑줄 ( ) 을 작성하여이 동작을 거부 할 수 있습니다 .

이 동작에 대한 자세한 내용은 여기 에서 기본값이있는 매개 변수의 외부 이름 섹션을 참조 하십시오 .


답변

나는 이것이 스위프트에서 코코아 규칙과 더 잘 맞는 objective-c에 더 가깝게 읽는 규칙을 강요한다고 생각합니다. objc에서는 첫 번째 매개 변수의 이름을 (외부 적으로) 지정하지 않습니다. 대신, 일반적으로 메소드 이름의 후반부에 다음과 같이 외부 이름을 포함시킵니다.

- (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;

[someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"];

Swift API 호출을 objc와 일치 시키려면 첫 번째 매개 변수의 외부 매개 변수 이름을 억제하려고합니다.

func myFancyMethodWithFirstName(_ firstName:String, lastName:String);

someInstance.myFancyMethodWithFirstName("John", lastName:"Doe")


답변

실제로 메소드를 정의하는 데 사용되는 실제 코드와 Apple 문서의 메소드 선언에는 차이가 있습니다. 의가 보자 UIControl
– addTarget을 : 조치 : forControlEvents를 : 예를 들어, 방법, 실제 코드는 다음과 같습니다
여기에 이미지 설명을 입력하십시오

그러나 문서에서는 다음과 같이 나타납니다 (대상 앞에 _ 알림).
여기에 이미지 설명을 입력하십시오

실제 코드에서 _는 메소드가 호출 될 때 두 번째 또는 그 이후의 매개 변수의 외부 이름이 나타나지 않도록하는 데 사용됩니다. 문서에서 매개 변수의 로컬 이름 앞에 _는 메소드 또는 함수를 호출 할 때 외부 이름.

매개 변수의 로컬 이름을 고유하게 제공하거나 공백없이 #을 추가하지 않으면 함수가 기본적으로 호출 될 때 외부 이름이 없습니다. 예를 들면 다음과 같습니다 . dispatch_after :
여기에 이미지 설명을 입력하십시오

그리고 문서에서 다음과 같이 나타납니다 (알림 3 _).
여기에 이미지 설명을 입력하십시오

함수 선언 규칙은 메소드에 대해 설명한 것과 동일합니다.


답변

더 시각적으로.

여기에 이미지 설명을 입력하십시오

보시다시피 _로컬 매개 변수 이름을 생략하거나 생략 하십시오 .