14일차 - 21.06.21

수킴·2021년 6월 21일
0

100DaysOfSwift

목록 보기
15/37
post-thumbnail

학습키워드

  • review(복습) - 2

1. Functions

함수를 사용하면 특정 기능을 수행하는 재사용 가능한 코드 조각들을 정의 할 수 있습니다.

  • 함수는 매개변수를 받아서 사용할 수 있습니다.
  • 함수는 호출되기 전까지는 작동하지 않습니다.
  • 매개변수는 외부, 내부에서 이름을 지정해서 사용할 수 있습니다.
  • 함수는 값을 반환할 수 있습니다.

2. Optionals

스위프트에서 값이 있고 없고를 표현해야 할 때, 사용자가 직접 값에 의미를 부여해서 판단할 수 있지만 겹치는 경우도 생길 것입니다.

ex) 정수의 경우 0 , 문자열의 경우 "" , " " 등등 → (확실하지 않습니다.)

값이 없다는 것을 확실히 표현하기 위해 스위프트에서는 옵셔널이라는 방법을 제공합니다.

  • nil : 값이 없음 , 옵셔널타입을 만들려면 타입 뒤에 ? 추가합니다.
  • nil 인 경우에 안전하게 처리해야 합니다.
  • 옵셔널언래핑을 통해 옵셔널에 값이 있는지 없는지 확인한 후, 값이 있는 경우 옵셔널래핑을 해제 후 코드블록을 실행합니다. if let , guard let
  • 값이 있는 것을 확신하는 경우 강제언래핑 ! 을 사용할 수 있습니다.

IUO 암묵적언래핑옵셔널타입

  • 보통 iOS의 UIKit 또는 macOS의 AppKit에서 사용자 인터페이스 요소로 작업 할 때 사용됩니다.

    → 미리 선언해야하지만 생성될 때까지는 사용할 수 없습니다. 애플은 불필요한 작업을 피하기 위해 마지막 순간에 사용자 인터페이스 요소를 만드는 것을 좋아합니다.

  • 일반 변수는 선언당시 값을 저장해야합니다. (빈 문자열이라도 저장해야합니다., nil은 저장할 수 없다)

  • 옵셔널변수는 값을 포함하지 않아도 됩니다.(사용하기 전에는 옵셔널을 해제해야 합니다.)

  • 암묵적언래핑옵셔널타입은 값을 포함하지 않아도 됩니다.(사용하기전에 옵셔널을 해제하지 않아도 됩니다.) 하지만 주의해야 합니다. 옵셔널을 풀지 않고 값에 직접 접근할 수 있지만 값이 없는 경우 접근하면 에러가 발생할 것입니다.

@IBOutlet weak var changeView: UIView!
@IBOutlet weak var rLabel: UILabel!
@IBOutlet weak var gLabel: UILabel!
@IBOutlet weak var bLabel: UILabel!

3. Optional chaining

많은 옵셔널을 해제해야하는 경우에 매번 해제 및 확인하는 작업은 번거로울 수 있습니다.

옵셔널체이닝을 사용하여 옵셔널에 값이 있는 경우에만 코드를 실행할 수 있습니다.

  • 강제언래핑보다 조금 더 앱 충돌을 방지할 수 있다. (강제 언래핑은 nil이면 바로 충돌발생하기 때문입니다.)
  • 값이 있는 경우에는 동작을 실행하고 값이 없다면 아무것도 하지 않습니다.
let album = albumReleased(year: 2006)?.someOptionalValue?.someOtherOptionalValue?.whatever
  • 모든 항목이 값이 있는경우에는 실행되지만 하나라도 nil 이라면 nil 을 반환합니다. (왼쪽에서 오른쪽으로 확인합니다.)

nil병합 연산자를 사용하면 기본값을 더 쉽게 지정할 수 있습니다. ??

let album = albumReleased(year: 2006) ?? "unknown"

4. Enumerations

스위프트는 직접만든 종류의 값들을 그룹화할 수 있는 방법을 제공합니다.

  • 열거형을 사용하면 오타를 줄일 수 있습니다.
  • 옵셔널도 none , some 으로 이루어진 열거형 (none : 값 없는 경우, some: 값을 래핑하는 경우)
  • 열거형 항목 중 추가 값을 인자로 받을 수 있습니다.
  • where 조건 추가할 수 있습니다.
enum WeatherType {
    case sun
    case cloud
    case rain
    case wind(speed: Int)
    case snow
}

func getHaterStatus(weather: WeatherType) -> String? {
    switch weather {
    case .sun:
        return nil
    case .wind(let speed) where speed < 10:
        return "meh"
    case .cloud, .wind:
        return "dislike"
    case .rain, .snow:
        return "hate"
    }
}

getHaterStatus(weather: WeatherType.cloud) // dislike
getHaterStatus(weather: WeatherType.wind(speed: 6)) // meh
getHaterStatus(weather: WeatherType.wind(speed: 16)) // dislike

5. Structs

구조체를 사용하면 여러 타입을 가진 데이터들을 하나로 그룹화할 수 있습니다.

  • 구조체는 멤버단위초기화를 자동으로 생성합니다.
  • 구조체의 인스턴스를 생성하면 속성이나 메서드에 접근할 수 있습니다.
  • 스위프트는 copy on write 기술을 사용합니다. (실제로 데이터를 변경하는 경우에 복사합니다.)
  • 클래스보다 더 많은 안전성을 제공합니다.

6. Classes

클래스를 사용하면 여러 타입을 가진 데이터들을 하나로 그룹화할 수 있습니다.

  • 클래스는 멤버단위초기화가 자동으로 생성되지 않습니다.
  • 상속을 통해 다른 클래스를 기반으로 클래스를 정의하여 사용할 수 있습니다.
  • 인스턴스를 복사하면 두 가지 모두 동일한 데이터를 가리키기 때문에 하나를 변경하면 같이 변경됩니다.
  • 구조체보다 더 많은 유연성을 제공합니다.

Objective-C 코드

애플 운영체제의 일부가 스위프트 클래스의 메서드를 호출하도록하려면 @objc 키워드를 표시해야합니다.

@objcObjective-C 의 줄임말이며 이전 Objective-C 코드에서 실행할 수있는 메서드를 효과적으로 표시합니다.

@objc 키워드를 사용하지 않으려면 @objcMembers클래스 앞에 배치 하여 자동으로 모든 메서드를 Objective-C에서 사용할 수 있도록 할 수 있습니다.

링크

100 Days of Swift - Day 14 - Hacking with Swift

profile
iOS 공부 중 🧑🏻‍💻

0개의 댓글