신속한 밑줄이 필요한 이유는 무엇입니까?


161

여기 에 "참고 : _"나는 그 가치에 신경 쓰지 않는다 " 는 의미를 가지고 있지만 JavaScript에서 온 것입니다. 그 의미를 이해하지 못합니다.

이 함수를 인쇄 할 수있는 유일한 방법은 매개 변수 앞에 밑줄을 사용하는 것입니다.

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))

밑줄이 없으면 오류를 피하기 위해 다음과 같이 작성해야합니다.

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))

이 밑줄 사용법을 이해하지 못합니다. 언제, 어떻게 그리고 왜이 밑줄을 사용해야합니까?

답변:


354

다른 사용 사례에는 몇 가지 뉘앙스가 있지만 일반적으로 밑줄은 "무시"를 의미합니다.


새로운 함수를 선언 할 때 밑줄은 Swift에게 매개 변수가 호출 될 때 레이블이 없어야한다고 알려줍니다. 더 완전한 함수 선언은 다음과 같습니다.

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

"label"은 인수 레이블이며 함수를 호출 할 때 있어야합니다. Swift 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()

정의 된 함수 유형을 구현하는 클로저를 작성할 때 밑줄을 사용하여 특정 매개 변수를 무시할 수 있습니다.

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
    }
}

마지막 두 스타일과 관련이 있습니다. 로컬 변수 / 상수를 바인딩하는 흐름 제어 구문을 사용할 _때이를 무시하는 데 사용할 수 있습니다 . 예를 들어 멤버에 액세스 할 필요없이 시퀀스를 반복하려면 다음을 수행하십시오.

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

switch 문에서 튜플 케이스를 바인딩하는 경우이 예에서와 같이 밑줄은 와일드 카드로 작동 할 수 있습니다 ( 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")
}

(주석에서 언급 한 바와 같이) 나는 이후 포함됩니다 마지막으로 아주 관련이없는 것 일, 그러나 여기 사람들을 이끌없는 것 :는 밑줄을 - 예를 들어 식별자 var _foo, func do_the_thing(), struct Stuff_- 스위프트에 특히 아무 의미도 있지만, 몇 가지 용도로 사용 프로그래머들 사이에서.

이름 내의 밑줄은 스타일 선택이지만 Swift 커뮤니티에서는 선호되지 않습니다. Swift 커뮤니티에서는 유형에 UpperCamelCase를 사용하고 다른 모든 기호에 대해서는 lowerCamelCase를 사용하는 것에 대한 강력한 규칙이 있습니다.

밑줄로 기호 이름 앞에 접두사를 붙이거나 접미사를 붙이는 것은 스타일 규칙으로, 역사적으로 개인용 / 내부 용 전용 기호를 내 보낸 API와 구별하는 데 사용됩니다. 그러나 Swift에는 액세스 수정자가 있으므로이 규칙은 일반적으로 Swift에서 비 아이디 오닉으로 간주됩니다.

func __foo()Apple SDK의 깊이에 이중 밑줄 ( )이 있는 몇 개의 기호가 숨겨져 있습니다.이 NS_REFINED_FOR_SWIFT속성을 사용하여 Swift로 가져온 (Obj) C 기호가 있습니다. Apple은 (Obj) C API의 "더 간결한"버전을 만들고 싶을 때이를 사용합니다 (예 : 유형에 구애받지 않는 방법을 일반 방법으로 만들기) . 세련된 Swift 버전을 작동 시키려면 가져온 API를 사용해야하므로 __대부분의 도구와 문서에서 API를 숨기고 사용할 수 있도록합니다.


@rickster, 메소드 시작시 밑줄의 중요성은 무엇입니까? 시퀀스 프로토콜에서 다음과 같이이 1-> func _copyContents (init : UnsafeMutableBufferPointer <Element>)-> (Iterator, UnsafeMutableBufferPointer <Element> .Index)}와 같습니다.
dev gr

@devgr : 완전히 관련이 없으므로 별도의 질문을 게시하는 것이 좋습니다.
rickster

물론, 별도의 질문을 게시 할 것입니다.
dev gr

함수 반환을위한 "아무것도 할당하지 않음"에 감사드립니다. 이것이 내가 찾던 것입니다.
absin

8

허용 된 답변 외에도 유스 케이스 중 하나는 _코드에 긴 숫자를 작성 해야하는 경우입니다

더 읽기 쉬운 숫자

사람이 쉽게 읽을 수있는 것은 아닙니다.

let x = 1000000000000

_사람이 읽을 수 있도록 숫자를 추가 할 수 있습니다 .

let x = 1_000_000_000_000

6

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


4
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)
}

_매개 변수 이름에 대한 자리 표시 자입니다. 예를 들어 두 번째 함수에서는 다르게 호출하여 매개 변수 name을 작성해야합니다 a: 1.

Swift의 함수 이름 규칙은입니다 funcName(param1:param2:). 그리고 함수 이름 _을 만들려면 자리 표시 자로 필요합니다 .

이름에서 이름은

divmod(_:_:)

두 번째는

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