안녕하세요. 엘림입니다🙇🏻♀️
Swift 공식 문서 정독하기 2편(?)입니다!
가끔 필요할때만 들어가서 봤는데, 한번은 쭉 읽어보는게 좋을 것 같아서 시작하게 되었어욥.
제 스타일대로 정리했으니 추가적으로 더 필요한 정보는
공식문서 링크를 눌러 확인해주세용!
사실 저는 거의 한국어로 번역된 사이트를 확인했습니다!
자, 그럼 시작해볼까요
이 글은 공부하면서 작성한 글이기 때문에 잘못된 정보가 있을 수 있습니다.🥺
금방 잊어버릴... 미래의 저에게 다시 알려주기 위한 글이다보니
혹시라도 틀린 부분이 있다면, 댓글로 친절하게 알려주시길 부탁드립니다.🙏
Swift에서 통상적으로 이용하는 +
,-
,/
,%
같은 산술 연산자와
&&
, ||
같은 논리 연산자,
a..<b
, a...b
같은 범위를 지정할 수 있는 범위 연산자 에 대해 알아보겠습니다.
관련해서는 애플 공식문서의 연산자 선언에서도 확인하실 수 있습니다.
연산자에는 단항(unary), 이항(binary) 그리고 삼항(ternary) 연산자가 있습니다.
단항 연산자는 -a, !b, c!와 같이 하나의 대상에 앞뒤에 바로 붙여 사용하는 연산자입니다.
이항 연산자는 2 + 3 같이 두 대상 사이에 위치하는 연산자이며, 중위 연산자라고도 합니다.
삼항 연산자는 a ? b : c 형태로 Swift에 삼항 연산자는 이 연산자 단 하나만 존재합니다.
할당 연산자는 값을 초기화 시키거나 변경합니다.
C나 Objective-C와는 다르게 Swift에서는 할당 연산자는 값을 반환하지 않습니다.
let b = 10
var a = 5
a = b
// a 값은 10
let (x, y) = (1, 2)
// x 는 1, y 값은 2 가 됩니다.
if x = y {
// x= y 는 값을 반환하지 않기 때문에 이 문법은 올바르지 않습니다.
}
Swift는 모든 숫자 형에서 사용 가능한 4가지 표준 사칙 연산자를 지원합니다.
C나 ObjectiveC와 달리 Swift는 사칙 연산의 값이 오버플로우 되는 것을 허용하지 않습니다. 만약 이것을 허용하고 싶으면 Swift의 오버플로우 연산자를 이용해 지원할 수 있습니다.
print(9 % 4) // 1
print(9 % -4) // 1
print(-9 % -4) // -1
print(-9 % 4) // -1
나머지 연산자의 앞쪽 수가 음수라면 결과값도 음수이며, 연산자의 뒤쪽 음수는 결과값에 영향을 미치지 않습니다.
let three = 3
let minusThree = -three // -3
let plusThree = -minusThree // 3
let minusSix = -6
let alsoMinusSix = +minusSix // -6
숫자 값은 -
연산자에 의해 부호가 변하지만, +
연산자 부호로는 아무런 영향도 받지 않습니다.
var a = 1
a += 2
// a는 3
합성 할당 연산자는 값을 반환하지 않습니다. 즉, let b = a+=2
와 같은 문법은 사용할 수 없습니다.
1 == 1 // true
2 != 1 // true
2 > 1 // true
1 < 2 // true
1 >= 1 // true
2 <= 1 // false
let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world"
7개 미만의 요소를 갖는 튜플도 비교할 수 있습니다. (그 이상의 요소를 갖는 경우 직접 비교 연산자를 구현해야 합니다.)
비교는 왼쪽에서 오른쪽 방향으로 이뤄지고, 한번에 한개의 값만 비교합니다. 두 개를 비교했을때 다른 경우 멈추고, 같다면 오른쪽 요소로 이동하여 또 비교합니다.
튜플을 비교할 떄에도 비교 연산자가 해당 값을 비교할 수 있는 경우에만 비교를 수행할 수 있습니다.
(1, "zebra") < (2, "apple") // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, "apple") < (3, "bird") // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, "dog") == (4, "dog") // true 왼쪽 4는 오른쪽 4와 같고 왼쪽 dog는 오른쪽 dog와 같기 때문
("blue", false) < ("purple", true) // 에러!! Boolean 값은 < 연산자로 비교할 수 없기 때문
삼항 조건 연산자는 question ? answer1 : answer2
의 구조를 갖습니다. 그래서 question 조건이 참인경우 answer1이 거짓인 경우 answer2가 실행됩니다.
삼항 조건 연산자는 코드를 짧게 만들어 가독성을 높여줍니다.
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight는 90 (40 + 50)
💡 1번 링크와 2번 링크에 아래 Nil 병합 연산자와 삼항 조건 연산자 등을 자제하면 속도를 향상시킬 수 있다는 내용이 있네요!
nil 병합 연산자는 a ?? b
형태를 갖는 연산자 입니다. 옵셔널 a를 벗겨서(unwraps) 만약 a가 nil 인 경우 b를 반환합니다.
a != nil ? a! : b
코드의 축약형입니다.
let defaultColorName = "red"
var userDefinedColorName: String? // 옵셔널 타입의 defaults는 nil입니다.
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorNam이 nil이므로 colorNameToUse 값은 defaultColorName인 "red"가 설정 됩니다.
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName가 nil이 아니므로 colorNameToUse 는 "green"이 됩니다.
(a...b)
와 같이 표현됩니다.
a부터 b까지의 숫자를 나타내며, a와 b를 모두 포함합니다. (a가 b보다 클 수 없습니다.)
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
(a..<b)
의 형태로 a부터 b보다 작을 때까지의 범위를 갖습니다. 즉, a부터 b-1까지 값을 갖습니다.
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
[a..]
, [..a]
, [..<a]
의 형태로 범위의 시작 혹은 끝만 지정해 사용하는 범위 연산자 입니다. 지정한 시작 값 혹은 끝 값은 범위에 포함됩니다.
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
for name in names[..<2] {
print(name)
}
// Anna
// Alex
단방향 범위 연산자는 subscript뿐만 아니라 특정 값을 포함하는지 여부를 확인할 때도 사용 가능합니다.
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
두 개 이상의 논리 연산자를 조합해서 사용할 수 있습니다.
Swift의 논리 연산자 && 와 || 는 왼쪽의 표현을 우선해서 논리 계산을 합니다.
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
논리 연산자의 적용 우선 순위를 연산자에 맡지기 않고 명시적으로 괄호를 사용해 계산 순서를 지정할 수 있습니다.
이렇게 괄호를 사용하면 가독성이 높아져 코드의 의도를 더 명확하게 하는데 도움이 됩니다.
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
오늘은 스위프트 공식문서에서 두번째 챕터인 Basic Operatiors를 읽어보았습니다~
다음에는 Strings and Characters를 읽어보도록 하겠습니다!
감사합니다🙇🏻♀️