3일차 - 21.06.10

수킴·2021년 6월 10일
0

100DaysOfSwift

목록 보기
4/37
post-thumbnail

학습키워드

  • operators
  • conditions
  • operator overloading
  • switch statements

1. Arithmetic Operators (산술 연산자)

  • 산수 연산자
    • + : 덧셈 연산자
    • - : 뺼셈 연산자
    • * : 곱셈 연산자
    • / : 나눗셈 연산자
    • % : 나눗셈 후 나머지를 계산하는 연산자 (연산자는 정수만)

Int형에 Double형을 추가할 수 없는 이유?

스위프트에는 숫자데이터를 저장하는 타입은 Double , Float , Int 등등이 있습니다.

이렇게 나누어진 이유? 각각의 타입은 데이터를 다르게 저장하기 때문에,

예를 들어, Double과 Int 모두 숫자를 저장하는 데 동일한 양의 메모리를 사용하지만 Int는 정수만 저장하는 반면 Double은 소수점 뒤에 값을 저장할 수 있습니다. 따라서 Double형을 Int형에 저장한다면 숫자의 손실이 있을 수 있습니다.

반대로 Int형을 Double형에 저장한다면 문제는 Double형은 더 작은 숫자에 대한 정밀도는 매우 뛰어나지만 큰 숫자로 작업을 시작하면 점점 더 모호해집니다.

Double이 보유할 수 없는 특정한 숫자들이 있기 때문에, 대신 아주 약간 다른 값을 저장합니다.

Int형은 분수값을 저장하지는 못하는 정확한 값을 저장할 수 있습니다.

  • 예시)

    let value: Double = 90000000000000001 // 90000000000000000
    let value: Int = 90000000000000001 // 90000000000000001
  • 👍 기타 숫자 단위

    1. Fraction (분수 값)

      예시 ) 1, 1/2, 1/3, 1/4

    2. Percent

      예시 ) 100%, 50%, 33.3%

    3. Decimal

      예시 ) 1.0, 0.5, 0.33, 0.25

따라서, Int나 Double 타입을 서로 저장하거나 Float과 Int형의 곱셈 등등이 스위프트에서 경고가 발생합니다

나머지 연산자가 있는 이유?

Int형을 사용해서 나눗셈을 하는 경우 스위프트는 나눈 값에서 나머지를 뺀 값을 연산합니다.

10 / 6 = 1.66666이지만 1결과출력

  • 예시 ) 남은날짜를 사용자에게 알려줘야 하는 경우

    // 1
    let weeks: Int = 465 / 7
    print("There are \(weeks) weeks until the event.") // 66
    
    // 2
    let weeks: Double = 465 / 7
    print("There are \(weeks) weeks until the event.") // 66.42857142857143
    
    // 3
    let weeks: Int = 465 / 7
    let days: Int = 465 % 7
    print("There are \(weeks) weeks and \(days) days until the event.") // 66, 3

💡 나머지가 0인지 확인하는 방법

let number = 465
number.isMultiple(of: 2) // false

2. Operator overloading

오버로딩(Overloading) : 같은 함수의 이름을 가지고 있지만 파라미터를 다르게 하여 다양한 유형의 호출에 응답이 가능한 것

스위프트는 연산자 오버로딩을 지원합니다. 산수연산이외에 + 연산자를 문자열이나 배열결합등에 사용할 수 있다. (Bool타입은 ❌ )

let meaningOfLife = 42
let doubleMeaning = 42 + 42

let fakers = "Fakers gonna "
let action = fakers + "fake"

let firstHalf = ["John", "Paul"]
let secondHalf = ["George", "Ringo"]
let beatles = firstHalf + secondHalf

3. Compound assignment operators

스위프트는 복합할당 연산자를 제공합니다. 이 연산자를 사용하면 연산자와 할당을 한번에 할 수 있어서 제자리에서 변수를 변경시킬수 있습니다.

+, -, *, /, % 뒤에 = 를 붙여서 사용합니다.

4. Comparison operators

스위프트는 비교연산자를 제공합니다. 비교연산자는 여러가지 타입의 데이터끼리 비교가 가능합니다.(Int, Double, String, Date, enum . . .)

  • 비교연산자
    • == : 두 값이 동일한지 확인
    • != : 두 값이 다른지 확인
    • < : 두 값을 비교 (오른쪽 값이 더 크다면 true)
    • > : 두 값을 비교 (오른쪽 값이 더 크다면 false)

💡 문자열은 각 문자의 아스키코드 값을 통해 비교

let str = "abcDEF"

for index in str.utf8 {
    print(index)// 97 98 99 68 69
}

Swift 5.3 이상에서는 열거형도 비교가능 Comparble채택

protocol Comparable : Equatable

enum Sizes: Comparable {
    case small
    case medium
    case large
}

let first = Sizes.small
let second = Sizes.large
print(first < second) // false

5. Conditions

스위프트에서는 if 명령문을 사용한 조건문을 제공합니다.

let firstCard = 11
let secondCard = 10

if firstCard + secondCard == 2 {
    print("Aces – lucky!")
} else if firstCard + secondCard == 21 {
    print("Blackjack!")
} else {
    print("Regular cards")
}

6. Combining conditions

스위프트에서는 논리연산자 &&, ||를 제공합니다.

  • && : 두 조건 모두 만족하는 경우 참입니다.
  • || : 두 조건 중 하나만 만족하는 경우 참입니다.
if (isOwner == true && isEditingEnabled) || isAdmin == true {
    print("You can delete this post")
}

if isOwner == true && (isEditingEnabled || isAdmin == true) {
    print("You can delete this post")
}

논리연산자를 여러 번 사용할 때 순서를 정해주기 위해서는 () 를 사용해서 순서를 정해줍니다.

예시 코드에서 두가지 경우는 다른 결과를 반환할 수 있습니다.

7. The ternary operator

스위프트에서는 삼항연산자를 제공합니다. 한 번에 조건과 반환값을 지정할 수 있습니다.

조건 ? 참인 경우 반환값 : 거짓인 경우 반환값

let isAuthenticated = true
print(isAuthenticated ? "Welcome!" : "Who are you?")

8. Switch statements

스위프트에서 조건을 사용하는 경우 if 문 이외에 switch case 구문을 제공합니다.

이 구문을 사용하면 한 번 작성한 다음 가능한 모든 결과와 각각에 대해 코드를 작성할 수 있습니다.

let weather = "snow"

switch weather {
case "rain":
    print("Bring an umbrella")
case "snow":
    print("Wrap up warm")
    fallthrough
case "sunny":
    print("Wear sunscreen")
default:
    print("Enjoy your day!")
}

// console
// "Wrap up warm"
// "Wear sunscreen"

fallthrough 키워드를 사용하면 실행을 계속합니다.

if 대신 switch를 사용해야 하는 경우

  1. Swift requires that its switch statements are exhaustive, which means you must either have a case block for every possible value to check (e.g. all cases of an enum) or you must have a default case. This isn’t true for if and else if, so you might accidentally miss a case.
  2. When you use switch to check a value for multiple possible results, that value will only be read once, whereas if you use if it will be read multiple times. This becomes more important when you start using function calls, because some of these can be slow.
  3. Swift’s switch cases allow for advanced pattern matching that is unwieldy with if.

9. Range operators

스위프트는 범위연산자를 제공합니다.

..< : 반 열린 범위연산자 , ... : 닫힌 범위연산자

1..<5 // 1,2,3,4 
1...5 // 1,2,3,4,5
1 ..< 5 // 피연산자 모두 공백을 주면 공백허용
1 ... 5 

let a: ClosedRange<Int> = 1...3
print(a) // 1...3

링크

100 Days of Swift - Day 3 - Hacking with Swift

profile
iOS 공부 중 🧑🏻‍💻

0개의 댓글