이 글은 해당 문서(https://www.codingem.com/swift-underscore/)를 요약/번역한 글입니다.
functionName(label: "value")
func greet(_ name: String) {
print("Hello, \(name)")
}
greet("Alice")
위와 같이 레이블 앞에 _
를 추가하면 함수 호출 시 레이블을 생략할 수 있다.
반복문 파라미터를 사용하지 않을 경우에 _
로 생략 가능하다.
for _ in 1...5 {
print ("Hello")
}
Output
Hello
Hello
Hello
Hello
Hello
튜플 구성 요소 중 필요하지 않는 요소는 _
를 통해 무시 가능하다.
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
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
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")
}
}
}
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을 통해 확인 할 수 있듯이 필요하지 않은 요소는 _
를 활용해 생략할 수 있다.
만약 이런 함수가 있다고 가정해보자.
func giveName() -> String {
return "Alice"
}
단순히 다음과 같이 표현하여 반환 값을 버릴 수도 있지만,
giveName()
_
를 활용하여 반환 값이 필요없다는 것을 강조하고 명시할 수 있다.
_ = giveName()
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 메소드가 정의하는 파라미터 개수와 일치하게 정의해야 합니다. 그러나 파라미터 값이 필요없을 시에는 _
를 사용해 생략 가능합니다. 위 예시와 같이 _
을 연달아 사용하는 것도 가능합니다.