[Swift] "_"(underscore)의 역할

CastleSilver·2023년 4월 14일
0

iOS 공부

목록 보기
10/13
post-thumbnail

이 글은 해당 문서(https://www.codingem.com/swift-underscore/)를 요약/번역한 글입니다.


1. 함수 인자 레이블 생략

기존 함수 호출 시

functionName(label: "value")

레이블 생략 시

func greet(_ name: String) {
    print("Hello, \(name)")
}
greet("Alice")

위와 같이 레이블 앞에 _를 추가하면 함수 호출 시 레이블을 생략할 수 있다.


2. 반복문 파라미터 생략

반복문 파라미터를 사용하지 않을 경우에 _로 생략 가능하다.

for _ in 1...5 {
    print ("Hello")
}

Output

Hello
Hello
Hello
Hello
Hello


3. 튜플 구성요소 무시

튜플 구성 요소 중 필요하지 않는 요소는 _를 통해 무시 가능하다.

let coords = (1.0, 2.0, 0.5, 2.5)
let (x, y, z, _) = coords
print(x, y, z)

Output

1.0 2.0 0.5

switch문에 쓰이는 튜플도 다음과 같이 무시 가능하다.

let score = ("Alice", 3)
switch score {
case (_, 3):
    print("Par")
case (_, 2):
    print("Birdie")
case (_, 1):
    print("Ace")
default:
    fatalError("Unsupported")
}

Output

Par


4. 숫자 가독성 향상

1_000_000      // instead of 1000000
0.000_000_001  // instead of 0.000000001
1_403_182_938  // instead of 1403182938
0.619_241_053  // instead of 0.619241053

5. Enum의 연관 값 무시

enum case 중에 연관 없는 값이 존재한다면 _를 활용해서 생략 가능하다.

예를 들어 다음과 같이 x, y값을 받는 enum이 있다고 하자.

enum Action {
    case Driving(Int, Int)
    case Walking(Int, Int)
}

여기에 x방향만 관련있는 함수를 추가하게 된다면 다음과 같이 y값은 _를 통해 무시할 수 있다.

enum Action {
    case Driving(Int, Int)
    case Walking(Int, Int)
    func horizontalMovement() {
        switch self {
        case .Driving(let xSpeed, _):
            print("Driving \(xSpeed)mph in x-direction")
        case .Walking(let xSpeed, _):
            print("Walking \(xSpeed)mph in x-direction")
        default:
            fatalError("Unsupported")
        }
    }
}

6. 클로저의 파라미터 생략

let scores = [
    ("Alice",    3),
    ("Bob",      3),
    ("Charlie",  2),
    ("David",    3),
    ("Emmanuel", 2)
]
let lessThanThree = scores.filter { (_, score) in return score < 3 }
lessThanThree.forEach { (name, _) in print("\(name)") }

Output

Charlie
Emmanuel

output을 통해 확인 할 수 있듯이 필요하지 않은 요소는 _를 활용해 생략할 수 있다.


7. 함수의 반환 값 생략

만약 이런 함수가 있다고 가정해보자.

func giveName() -> String {
    return "Alice"
}

단순히 다음과 같이 표현하여 반환 값을 버릴 수도 있지만,

giveName()

_를 활용하여 반환 값이 필요없다는 것을 강조하고 명시할 수 있다.

_ = giveName()

8. Override 파라미터 생략

class Pet {
    let name: String
    init(name: String) {
        self.name = name
    }
    func timeTo(_ command: String) { 
        if command == "eat" { print("Yum!") }
        else if command == "sleep" { print("Zzz...") }
    }
}
class Cat: Pet {
    // Cat does not care about the command, let's skip it.
    override func timeTo(_ _: String) {
        print("Meow!")
    }
}
// Example calls:
let dog = Pet(name: "Snoopy")
dog.timeTo("sleep")
let cat = Cat(name: "Luna")
cat.timeTo("sleep")

Output

Zzz...
Meow!

메소드를 오버라이드하려면 parent 메소드가 정의하는 파라미터 개수와 일치하게 정의해야 합니다. 그러나 파라미터 값이 필요없을 시에는 _를 사용해 생략 가능합니다. 위 예시와 같이 _을 연달아 사용하는 것도 가능합니다.

profile
우당탕탕 비전공자 개발자

0개의 댓글