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")
.
귀하의 경우로 돌아 가면 , 분명히 runAction
type과 관련되어 있기 때문에 방법 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 _).
함수 선언 규칙은 메소드에 대해 설명한 것과 동일합니다.