Swift References에서 _ 밑줄은 무엇입니까?


144

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에 대한 다른 질문에 대답하는 놀라운 일을합니다 .


3
[underscore.js]로 태그 됨 ??
Martin R

3
이 문서는 변수 이름에 기울임 꼴을 사용하는 수학적 규칙을 따릅니다. 예를 들면 : sin² + cos² = 1
강탈 mayoff

답변:


116

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

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

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

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 코드에만 적용됩니다.

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


9
_두 번째 매개 변수 앞에 쓰면 대답이 충분하다고 혼동됩니다 . 에있는 경우 func runAction(_action: SKAction!), _첫 번째 매개 변수 앞에 또는 다음 코드를 작성하면 func foo(_ s1: String) { // your code }Xcode가 경고를 주지만 func bringSubviewToFront(_ view: UIView)참조 와 같은 많은 코드 가있는 이유는 무엇입니까?
Will Zhang

10
기본적으로, 아무 이유없이 이것을하고 모든 사람을 혼란스럽게합니다. 대박.
botbot December

2
밑줄은 '와일드 카드 패턴'로 알려져있다 developer.apple.com/library/ios/documentation/Swift/Conceptual/...
user2143356

의사는 @Wyatt Zhang _은 첫 번째 매개 변수의 사용이 외부 적이라고 말합니다 . 디자이너가 코드에 충분하다고 생각하고 가독성을 높이 지 않으며, 반대로 코드를 더럽게한다고 가정 할 수 있습니다. 경고가 나타납니다. 참조는 반대의 목표를 가지고 있습니다. 가능한 한 명확해야합니다. 따라서 첫 번째 매개 변수의 밑줄은 모든 방법에 대해 언급됩니다. 그것은 모든 것을 설명 할 것입니다)
Dmitry Gryazin

4
Swift 3.0은 변경 사항에 유의하십시오. 달리 지정하지 않는 한 모든 레이블이 필요합니다. 따라서 -첫 번째 매개 변수 이전은 더 이상 필요하지 않습니다. 예 : override func viewWillAppear(_ animated: Bool)발신자 (Objective-C 코드)가 매개 변수 레이블을 사용하지 않을 것이라는 신호
Mr. T

85

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

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

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

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

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

이와 관련하여 :

let (result, _) = someFunctionThatReturnsATuple()

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


따라서이 경우 인수 (조치)가 옵션입니까?
혼란

1
아니요,이 경우 외부 매개 변수 이름 (action :)이 비어 있으므로 생략됩니다. 인수는 여전히 필요하지만 action :으로 태그되지 않았습니다.
David Berry

4
실제 답변은 @dasblinkenlight의 답변과 내 조합입니다. 그는이 특정 사례를보다 정확하게 다루고, 반면에 더 넓은 문제를 다룬다는 것은 무엇입니까?
David Berry

4
매우 큰 숫자의 경우에도 폐기 부호를 사용하여 다음과 같이 읽을 수 있습니다.let pi = 3.141_592_653_59
SMP

재미있게도, 당신은 또한 매우 큰 숫자를 읽기 어렵게 만드는 데 사용할 수 있습니다let pi = 3.1_4_15_92___63
David Berry

15

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중복 됩니다. 그것이 목적과 그 이유입니다.


13

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

func someFunction(externalParameterName localParameterName: Int)

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

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

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


그래서 ... 내 어리 석음이이 권리를 가지고 있는지 보자. 이 예제에서는 매개 변수 변수 / 상수의 이름을 "action"으로 지정하고이 함수에서 실행하려는 SKAction에 지정해야하며 Swift는 필요한 기본 매개 변수의 이름을 "action"으로 자동 지정합니다. 그러나이 작업의 이름을 사용자 지정하려면 함수 호출에 밑줄을 사용해야합니까?
혼란

4
@Confused 내 이해는 "action"이 이미 함수 이름의 일부이기 때문에 ' SK디자이너가 action두 번 쓰지 않기를 원한다는 것 입니다. 다시 말해, 그들은 당신이 쓰기를 원하지 않습니다 sprite.runAction(action:moveGroundSpritesForever). 외부 매개 변수 이름의 목적은 코드를 "문처럼 읽도록"만드는 것입니다. action두 번 사용 하면 그 목적을 잃을 것입니다.
dasblinkenlight

어둠 속에서 일부 조명이 켜졌습니다. 나는 그것을 얻는 것 같아요. 이 언어 기능은 Swift의 호출 함수를 Objective-C의 매개 변수를 사용하여 메소드를 호출하는 방법과 매우 유사하게 보이도록하기위한 것입니다. 아마도.
혼란

1
그러나 밑줄을 사용하여 기본값으로 정의 된 매개 변수에 대해 이러한 외부 매개 변수 이름을 사용하지 않도록 선택할 수 있습니다 ... 그 방법은 아직 보지 못했습니다. 계속 지켜 볼 것입니다.
혼란

쉽게 토글 사이에 할 수 있도록 그래서 ... 한마디로, 단순히, 명명 된 매개 변수와 순서 매개 변수 사이를 전환 foo.bar(param: 'fiddle') 하고 foo.bar('fiddle') ...하지만 여러 인수와 매우 관련되고 하나 개의 인수를 정말 명확하게하지 않습니다 : 참고 foo.bar(param1: 'fiddle', param2: 'dee')foo.bar('fiddle','dee')
jrypkahauer

10

나는 이것이 스위프트에서 코코아 규칙과 더 잘 맞는 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")

2
나는이 설명을 좋아한다. Obj-C를 먼저 배운 후에는 문제를 해결했습니다. 또한 Swift에서 메소드의 이름을 적절하게 지정하는 것의 중요성, 즉 메소드 이름의 후반 부분은 일반적으로 Obj-C에서와 같이 첫 번째 인수를 설명해야합니다. 좋은 물건.
rrrrrraul

5

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

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

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

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

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

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


1

더 시각적으로.

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

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

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