2016-09-21 4 views
57

Here "참고 : _은"나는 그 가치에 대해 신경 쓰지 않는다 "는 것을 의미하지만, 자바 스크립트에서 오는 것은 그 의미가 무엇인지 이해하지 못합니다.왜 밑줄이 빨리 필요합니까?

func divmod(a: Int, b:Int) -> (Int, Int) { 
    return (a/b, a % b) 
} 

print(divmod(a: 7, b: 3)) 
print(divmod(a: 5, b: 2)) 
print(divmod(a: 12,b: 4)) 
: 오류를 피하기 위해 내가 이런 식으로 작성해야 밑줄없이

func divmod(_ a: Int, _ b:Int) -> (Int, Int) { 
    return (a/b, a % b) 
} 

print(divmod(7, 3)) 
print(divmod(5, 2)) 
print(divmod(12,4)) 

: 나는 인쇄에 이러한 기능을 얻을 수 있습니다

수있는 유일한 방법은 매개 변수 앞에 밑줄을 사용했다

이 밑줄의 사용법을 이해할 수 없습니다. 어떻게, 왜 그리고 어떻게 밑줄을 사용합니까?

답변

143

이지만, 일반적으로 밑줄이 "이 무시"을 의미하는 반면, 제 이름으로

는 이름

divmod(_:_:) 

이다.


새로운 기능을 선언

는 밑줄 호출 할 때 매개 변수에 레이블이없는 것을 스위프트 알 - 그건 당신이보고있는 경우입니다. 풀러 함수 선언은 다음과 같습니다 :

func myFunc(label name: Int) // call it like myFunc(label: 3) 

는 "라벨은"인수 라벨, 당신은 함수를 호출 할 때 있어야합니다. (스위프트 3 이후에는 기본적으로 모든 인수에 레이블이 필요합니다.) "name"은 함수 내에서 사용하는 인수에 대한 변수 이름입니다. 더 짧은 형태는 다음과 같습니다

func myFunc(name: Int) // call it like myFunc(name: 3) 

이 외부 인자 라벨과 내부 매개 변수 이름에 동일한 단어를 사용 할 수있는 바로 가기입니다. func myFunc(name name: Int)과 같습니다.

매개 변수 레이블없이 함수를 호출 할 수있게하려면 밑줄 _을 사용하여 레이블을 아무 것도/무시하지 않도록합니다. (이 경우 매개 변수를 사용하려면 내부 이름을 제공해야합니다.밑줄이 "아무것도 지정하지"를 의미 할당 문에서


func myFunc(_ name: Int) // call it like myFunc(3) 
)

. 결과를 반환하지만 반환 값을 신경 쓰지 않는 함수를 호출하려는 경우이 옵션을 사용할 수 있습니다.

_ = someFunction() 

기사에서 당신이 반환 된 튜플의 한 요소를 무시하는 링크처럼 또는 : 당신이 어떤 정의 함수 유형을 구현하는 폐쇄를 쓸 때

let (x, _) = someFunctionThatReturnsXandY() 

, 당신이 할 수있는 특정 매개 변수를 무시하려면 밑줄을 사용하십시오. 프로토콜을 채택하거나 슈퍼 클래스 메소드를 오버라이드 (override) 함수를 선언 할 때

PHPhotoLibrary.performChanges({ /* some changes */ }, 
    completionHandler: { success, _ in // don't care about error 
     if success { print("yay") } 
    }) 

마찬가지로, 당신은 매개 변수를 무시하는 매개 변수에 대한 이름_를 사용할 수 있습니다. 프로토콜/수퍼 클래스는 매개 변수에 레이블이 없다는 것을 정의 할 수도 있기 때문에 연속으로 두 개의 밑줄로 끝날 수도 있습니다.

class MyView: NSView { 
    override func mouseDown(with _: NSEvent) { 
     // don't care about event, do same thing for every mouse down 
    } 
    override func draw(_ _: NSRect) { 
     // don't care about dirty rect, always redraw the whole view 
    } 
} 

다소 지난 스타일 관련 : 로컬 변수를 결합하는 흐름 제어 구조를 사용하는 경우/상수이를 무시 _를 사용할 수있다. 이 같이 switch 문에서 튜플 케이스를 결합하는 경우

for _ in 1...20 { // or 0..<20 
    // do something 20 times 
} 

는 밑줄이 와일드 카드로 작업 할 수 있습니다 : 예를 들어, 회원에 액세스 할 필요없이 순서를 반복하려면 예 (The Swift Programming Language 하나에서 단축) :

switch somePoint { // somePoint is an (Int, Int) tuple 
case (0, 0): 
    print("(0, 0) is at the origin") 
case (_, 0): 
    print("(\(somePoint.0), 0) is on the x-axis") 
case (0, _): 
    print("(0, \(somePoint.1)) is on the y-axis") 
default: 
    print("(\(somePoint.0), \(somePoint.1)) isn't on an axis") 
} 
+2

위대한 설명, 당신에게 선생님 감사합니다! –

+1

아주 좋은 유스 케이스를 잊어 버린 것 같아요. 때로는 배열이나 사전에있는 ** 번호 **에만 관심이 있고 실제 값에는 관심이없는 * 경우 *가 있습니다. 그래서 당신은'forArray {do stuff} '와 같은 것을합니다. 일반적으로 값을 신경 쓰면 'someArray {do stuff}'의 객체에 대해 ' – Honey

+0

좋습니다. 나는 그것을 추가했다. – rickster

1

Swift 3부터 함수 호출시 매개 변수 이름을 지정하는 것이 필수적이되었습니다. 따라서, 신속한 2로 작성된 코드에 큰 문제가 발생할 수 있으므로 선언시 밑줄을 사용하여 호출시 매개 변수 이름을 쓰지 않아도됩니다. 따라서이 경우에는 "외부 매개 변수 이름에 신경 쓰지 마십시오"라고 말합니다. 여기서 외부 매개 변수 이름은 내부가 아닌 함수 (호출시) 외부의 매개 변수를 호출하는 곳입니다. 이러한 외부 매개 변수 이름을 인수 레이블이라고합니다. http://ericasadun.com/2016/02/09/the-trouble-with-argument-labels-some-thoughts/ ... 매개 변수에 두 가지 이름이 지정되어 있는지 확인하십시오. 우선 첫 번째는 밑줄이가는 곳입니다. 도움이되기를 바랍니다. 여전히 혼란 스러울 지 물어보십시오.

1
func divmod(_ a: Int, _ b:Int) -> (Int, Int) { 
    return (a/b, a % b) 
} 

func divmod(a: Int, b:Int) -> (Int, Int) { 
    return (a/b, a % b) 
} 

_은 매개 변수 이름의 자리 표시 자입니다. 귀하의 예제에서는 두 번째 함수에서 다르게 호출합니다. 매개 변수 이름은 a: 1이어야합니다.

스위프트의 함수 이름 규칙은 funcName(param1:param2:)이며, 함수 이름을 만들기 위해 자리 표시 자로 _이 필요합니다. 다른 사용 예에 ​​약간의 뉘앙스가있다 번째

divmod(a:b:)