ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 5.6 The Basics
    기술/iOS 2022. 2. 25. 19:43

    The Basics

    Constants and Variables

    상수와 변수 이름은 특정 타입의 값을 연결합니다. 상수의 값은 최초 지정 후 변경이 불가능하지만 변수는 다른 값으로 변경이 가능합니다.

    Declaring Constants and Variables

    상수와 변수는 반드시 사용하기 전 선언되어야 합니다.

    상수는 let 키워드, 변수는 var 키워드를 사용합니다.

    let maximumNumberOfLoginAttempts = 10
    var currentLoginAttempt = 0

    여러 개의 상수 또는 변수를 선언할 때 콤마로 구분하여 한줄 선언이 가능합니다.

    var x = 0, y = 0, z = 0

    NOTE
    코드에서 지정한 값이 변경되지 않는다면 항상 let 키워드로 상수 선언해야 합니다. 변수는 오직 값을 저장하고 변경할 때 선언합니다.

    Type Annotations

    상수 또는 변수를 선언할 때 저장할 수 있는 값의 종류를 명확하게 하기 위해 Type Annotation 을 제공할 수 있습니다.

    var welcomeMessage: String

    같은 타입에 여러개의 연관된 변수를 콤마로 변수 이름을 구분하고 마지막 변수 이름 뒤에 하나의 타입 명시를 통해 한줄로 선언할 수 있습니다.

    var red, green, blue: Double

    NOTE
    실제로 타입 명시가 필요한 경우는 드뭅니다. 상수 또는 변수를 선언할 때 초기값을 지정하면 Swift 는 상수 또는 변수에 사용될 타입을 거의 항상 유추할 수 있습니다.

    Naming Constants and Variables

    상수와 변수 이름은 유니코드 문자를 포함하여 대부분의 문자를 포함할 수 있습니다.

    공백, 수학 기호, 화살표, 개인 전용 유니코드 스칼라 값, 또는 선과 박스를 그리는 문자를 포함할 수 없습니다. 숫자는 이름의 다른곳에는 포함할 수 있지만 숫자로 시작하는 이름을 선언할 수는 없습니다.

    특정 타입으로 상수 또는 변수를 선언하면 동일한 이름으로 다시 선언하거나 다른 타입의 값을 저장하도록 변경하여 선언할 수 없습니다. 상수를 변수로 변경할 수 없습니다. 상수를 변수로 바꾸거나 변수를 상수로 바꿀 수 없습니다.

    NOTE
    Swift 키워드와 동일한 이름의 상수 또는 변수를 제공해야 한다면 이름을 백틱(`) 으로 묶어야 합니다. 그러나 선택의 여지가 없을 때까지는 키워드를 이름으로 사용하지 말아야 합니다.

    Printing Constants and Variables

    print 함수로 상수 또는 변수의 현재 값을 출력할 수 있습니다.

    Swift 는 긴 문자열에 상수 또는 변수의 이름을 포함하여 Swift 가 상수 또는 변수의 현재 값으로 대체하기 위해 문자열 삽입 ( String interpolation ) 을 사용합니다. 이름을 소괄호로 감싸고 여는 소괄호 전에 백슬래시를 추가해야 합니다.

    print("The current value of friendlyWelcome is \(friendlyWelcome)")
    // Prints "The current value of friendlyWelcome is Bonjour!"

    Comments

    코드에서 설명 또는 기록을 위해 실행되지 않는 문자를 추가할 땐 주석을 사용합니다. 주석은 코드가 컴파일 될 때 Swift 컴파일러에 의해 무시됩니다.

    한줄 주석은 두개의 슬래시 ( // ) 로 시작합니다.

    // This is a comment.

    여러 줄 주석은 슬래시 뒤에 애스터리크 ( \* ) 로 시작하고 애스터리크 뒤에 슬래시 ( */ ) 로 끝납니다.

    /* This is also a comment
    but is written over multiple lines. */

    Swift 는 여러 줄 주석 안에 다른 여러줄 주석을 통해 중첩이 가능합니다.
    중첩된 여러줄 주석을 사용하면 코드에 이미 여러줄 주석이 포함되어 있어도 큰 코드 블럭을 빠르고 쉽게 주석 처리할 수 있습니다.

    Semicolons

    Swift 는 코드의 각 구문 후에 세미콜론( ; ) 은 필수 조건이 아닙니다. 그러나 여러 구문을 한 줄로 작성할 경우 세미콜론은 필수로 작성되어야 합니다.

    let cat = "🐱"; print(cat)
    // Prints "🐱"

    Integers

    정수는 분수가 아닌 전체 숫자 입니다. 정수는 부호가있는 정수 또는 부호가 없는 정수가 있습니다.

    Swift 는 8, 16, 32, 62 비트 형태의 부호가 있는 정수와 부호가 없는 정수를 지원합니다.

    정수 범위

    각 정수 타입의 min , max 프로퍼티를 통해 각 정수 타입의 최소값과 최대 값을 가져올 수 있습니다.

    let minValue = UInt8.min
    let maxValue = UInt8.max

    Int

    대부분의 경우 특정 사이즈를 결정하지 않아도 됩니다. Swift 는 현재 플랫폼의 네이티브 사이즈와 같은 Int 인 정수 타입을 제공합니다.

    • 32-bit 플랫폼에서는 IntInt32 와 같은 크기를 가짐
    • 64-bit 플랫폼에서는 IntInt64 와 같은 크기를 가짐

    특정 크기의 정수로 작업해야하는 경우가 아니라면 항상 코드의 정수 값을 사용할 때 Int 를 사용해야합니다. 이것은 코드 일관성과 상호 운용성을 지원합니다.

    NOTE
    UInt 는 플랫폼의 네이티브 사이즈와 같은 크기의 부호 없는 정수 타입이 필요한 경우에만 사용해야합니다. 저장될 값이 음수가 아니더라도 Int 를 더 선호합니다. 정수 값에 Int 를 일관되게 사용하면 코드 상호 운용성을 지원하고 다른 숫자 형식간 변환이 필요가 없습니다.

    Floating-Point Numbers

    부동 소수점은 정수 타입의 값 범위보다 더 넓은 범위의 표현이 가능하고 Int 보다 더 크거나 작은 값 저장이 가능합니다. Swift 는 2개의 부호를 가진 부동 소수점 숫자 타입을 제공합니다.

    • Double 은 64-bit 부동 소수점 숫자를 표기
    • Float 은 32-bit 부동 소수점 숫자를 표기

    NOTE
    Double 은 최소 15 자리의 소수점 정확도를 가지고 있는 것에 반해 Float 는 더 적은 6 자리의 정확도를 가집니다. 사용할 부동 소수점 타입은 코드에서 작업해야 하는 값의 특성과 범위에 따라 다릅니다. 두 타입중에서는 Double 이 선호됩니다.

    Type Safety and Type Interface

    Swift 는 타입 세이프 언어입니다. 타입 세이프 언어를 사용하면 코드가 사용할 수 있는 값의 타입을 명확하게 알 수 있습니다. 코드를 컴파일 할 때 타입 검사를 수행하고 일치하지 않는 타입을 오류로 표시합니다. 이를 통해 개발 단계에서 가능한 빨리 오류를 포착하고 수정할 수 있습니다.

    타입 검사는 다른 타입 값으로 작업할 때 오류를 피하는데 도움이 됩니다. 그러나 이것이 모든 상수와 변수의 타입을 지정해야 한다는 것은 아닙니다. 필요한 값의 특정 타입을 지정하지 않으면 Swift 는 적절한 타입으로 타입 유추를 사용합니다. 타입 유추를 통해 컴파일러는 코드를 컴파일 할 때 제공한 값을 검사하여 특정 식의 타입을 자동으로 유추할 수 있습니다.

    타입 유추는 상수 또는 변수에 초기값을 선언할 때 유용합니다. 이것은 종종 선언하는 시점에 상수 또는 변수에 리터럴 값 또는 리터럴을 지정하여 수행됩니다.

    예를 들어 어떤 타입인지 선언하지 않고 새로운 상수를 43의 리터럴 값으로 지정하면 Swift 는 정수처럼 보이는 숫자로 초기화했기 때문에 상수가 Int 라고 추론합니다.

    반대로 어떤 부동 소수점 리터럴 타입인지 선언하지 않으면 Swift 는 Double 이라 추론합니다. Swift 는 부동 소수점 숫자 타입을 추론할 때 항상 Float 보다는 Double 을 선택합니다. 표현식에서 정수와 부동소수 리터럴을 결합하면 컨텍스트에서는 Double 타입으로 유추합니다.

    Numeric Literals

    • 접두사 없는 10 진수
    • ob 접두사로 2 진수
    • 0o 접두사로 8진수
    • 0x 접두사로 16 진수

    10 진수는 e 로 표시되는 지수를 가질 수 있습니다. 16 진수는 p 로 표시되는 지수를 가질 수 있습니다.

    숫자 리터럴은 읽기 쉽게 만드는 추가 포맷을 포함할 수 있습니다. 정수와 부동 소수점 모두 0으로 채워질 수 있으며 가독성을 돕기 위해 밑줄을 포함할 수 있습니다. 어떤 형식도 리터럴의 기본 값에 영향을 주지 않습니다.

    let paddedDouble = 000123.456
    let oneMillion = 1_000_000
    let justOverOneMillion = 1_000_000.000_000_1

    Numeric Type Conversion

    음수를 사용하지 않더라도 코드에서 상수와 변수가 정수로 사용이 되면 Int 타입을 사용합니다.

    외부 소스에서 명시적으로 크기가 지정된 데이터 또는 성능, 메모리 사용 또는 다른 성능 최적화를 위해 특별히 필요한 경우에만 다른 정수 타입을 사용해야합니다. 이러한 상황에서 명시적으로 크기 타입을 사용하면 실수로 인한 값 초과를 포착하고 사용중인 데이터의 특성을 알 수 있습니다.

    정수 변환

    정수를 저장할 수 있는 상수 또는 변수의 숫자 범위는 각 숫자 타입에 따라 다릅니다. 크기가 지정된 정수 타입의 상수 또는 변수에 맞지 않는 숫자는 컴파일 시 오류가 발생합니다.

    특정 숫자를 다른 타입으로 변환하려면 기존 값으로 원하는 타입의 새 숫자를 초기화합니다.

    let twoThousand: UInt16 = 2_000
    let one: UInt8 = 1
    let twoThousandAndOne = twoThousand + UInt16(one)

    정수와 부동 소수점 변환

    정수와 부동 소수점 숫자 타입의 변환은 명시적으로 변환해야 합니다.

    let three = 3
    let pointOneFourOneFiveNine = 0.14159
    let pi = Double(three) + pointOneFourOneFiveNine
    // pi equals 3.14159, and is inferred to be of type Double

    부동 소수점을 정수로 초기화할 때 소수점 아래를 버림합니다.

    Type Aliases

    타입 별칭은 이미 존재하는 타입을 다른 이름으로 정의합니다. typealias 키워드를 사용하여 정의할 수 있습니다.

    타입 별칭은 외부 소스에서 특정 크기의 데이터로 작업할 때와 같이 상황에 맞는 이르므로 기존 타입을 참조하려는 경우 유용합니다.

    typealias AudioSample = UInt16
    var maxAmplitudeFound = AudioSample.min
    // maxAmplitudeFound is now 0

    Booleans

    Swift 는 Bool 이라는 기본 부울 타입이 있습니다. 부울 값은 참 또는 거짓 값만 가지므로 논리적으로 참조됩니다. Swift는 2개의 부울 값인 truefalse 를 제공합니다.

    Swift 는 타입 세이프티 부울이 아닌 Bool 로 대체되는 것을 방지합니다. 아래 예제는 컴파일 시 에러를 발생합니다.

    let i = 1
    if i {
        // this example will not compile, and will report an error
    }

    Tuples

    튜플은 여러 값을 단일 복합 값으로 그룹화 합니다. 튜플 안에 값은 어떠한 타입도 가능하며 서로 같은 타입일 필요는 없습니다.

    튜플의 내용을 별도의 상수 또는 변수로 분해하여 평소와 같이 접근할 수 있습니다.

    let (statusCode, statusMessage) = http404Error
    print("The status code is \(statusCode)")
    // Prints "The status code is 404"
    print("The status message is \(statusMessage)")
    // Prints "The status message is Not Found"

    튜플의 값 중 일부만 필요한 경우 튜플을 분해할 때 밑줄( _ )로 튜플의 일부를 무시할 수 있습니다.

    let (justTheStatusCode, _) = http404Error
    print("The status code is \(justTheStatusCode)")
    // Prints "The status code is 404"

    또는 0에서 시작하는 인덱스를 통하여 튜플의 개별 요소에 접근할 수 있습니다.

    print("The status code is \(http404Error.0)")
    // Prints "The status code is 404"
    print("The status message is \(http404Error.1)")
    // Prints "The status message is Not Found"

    튜플을 정의할 때 튜플 요소에 이름을 정의할 수 있습니다.

    let http200Status = (statusCode: 200, description: "OK")

    튜플 요소에 이름이 있다면 요소의 값에 요소 이름으로 접근이 가능합니다.

    print("The status code is \(http200Status.statusCode)")
    // Prints "The status code is 200"
    print("The status message is \(http200Status.description)")
    // Prints "The status message is OK"

    튜플은 반환 값으로 특히 유용합니다.

    NOTE
    튜플은 관련된 값의 간단한 그룹에 유용합니다. 복잡한 데이터 구조를 생성하는데는 맞지 않습니다. 데이터 구조가 복잡한 경우 튜플이 아닌 클래스 또는 구조체를 사용해야합니다.

    Optionals

    값이 없는 경우 옵셔널을 사용합니다. 옵셔널은 2가지 가능성이 있습니다. 값이 있고 옵셔널을 풀어서 값에 접근하거나 값이 없을 수도 있습니다.

    nil

    옵셔널 변수에 특수 값 nil 로 지정하여 값이 없는 상태를 나타낼 수 있습니다.

    NOTE
    옵셔널이 아닌 상수와 변수에는 nil 을 사용할 수 없습니다. 코드에서 상수 또는 변수가 값이 없는 상태에서 동작이 필요하다면 항상 해당 타입의 옵셔널 값으로 선언해야 합니다.

    기본 값이 없이 옵셔널 변수를 정의하면 이 변수는 자동적으로 nil 로 설정됩니다.

    If Statements and Forced Unwrapping

    if 구문과 nil 을 비교하여 옵셔널에 값이 포함되어 있는지 확인할 수 있습니다.

    if convertedNumber != nill {}

    옵셔널에 값이 포함되어 있다고 확신하면 옵셔널 이름 끝에 ! 를 추가하여 값에 접근할 수 있습니다. 여기서 ! 는 “이 옵셔널은 확실히 값을 가지고 있습니다. 사용해도 괜찮습니다.” 라는 의미입니다. 이것을 옵셔널 값에 대한 강제로 풀기라 합니다.

    if convertedNumber != nil {
        print("convertedNumber has an integer value of \(convertedNumber!).")
    }
    // Prints "convertedNumber has an integer value of 123."

    NOTE
    ! 를 사용하여 값이 없는 옵셔널에 사용하면 런타임 에러가 발생합니다.
    항상 ! 를 사용하여 값을 강제로 풀기 전 옵셔널에 nil 이 아닌 값이 있다는 것을 확실시 해야 합니다.

    Optional Binding

    옵셔널이 값을 포함하고 있는지 확인하고 값이 있는 경우 해당 값을 임시 상수 또는 변수로 사용할 수 있게 해줍니다.

    if let constantName = somOptional {}

    Implicitly Unwrapped Optionals

    때로는 프로그램 구조에서 옵셔널이 값을 처음 설정한 후에는 항상 값을 갖는 건 분명ㅎㅂ니다. 이러한 경우 항상 값이 있다고 가정할 수 있으므로 접근할 때마다 옵셔널의 값을 확인하고 언래핑할 필요가 없습니다.

    이러한 옵셔널은 암시적으로 언래핑된 옵셔널로 정의됩니다. 옵셔널을 만들기 위해 타입 뒤에 물음표 ( String? ) 을 작성하는 대신에 느낌표 ( String! ) 로 암시적으로 언래핑된 옵셔널을 사용합니다.

    암시적으로 언래핑된 옵셔널은 옵셔널이 처음 정의된 직후 옵셔널의 값이 존재하는 것으로 확인되고 그 이후 모든 시점에 존재한다고 가정할 수 있는 경우에 유용합니다.

    암시적으로 언래핑된 옵셔널은 내부적으로 옵셔널이지만 옵셔널에 접근할 때마다 옵셔널 값을 풀 필요없이 옵셔널 값이 아닌 것 처럼 사용할 수 있습니다.

    암시적으로 언래핑된 옵셔널이 nil 이고 래핑된 값에 접근하려고 하면 런타임 에러가 발생합니다.

    Error Handling

    함수 선언에 throws 키워드를 포함시켜 에러가 발생할 수 있음을 나타냅니다. 에러를 발생할 수 있는 함수를 호출할 때는 표현식 앞에 try 키워드를 붙여야 합니다.

    func canThrowAnError() throws {
        // this function may or may not throw an error
    }
    
    do {
        try canThrowAnError()
        // no error was thrown
    } catch {
        // an error was thrown
    }

    Assertions and Preconditions

    런타임시 발생하는 조건입니다. 추가 코드를 실행하기 전 이를 사용하여 필수조건이 충족되는지 확인할 수 있습니다. 주장 또는 전제조건의 부울 조건이 true 이면 코드는 평소와 같이 진해되지만 조건이 false 인 경우 프로그램의 현재 상태는 유효하지 않아 코드는 종료됩니다.

    주장은 개발과정에서 실수와 잘못된 가정을 찾는데 도움이 되고 전제조건은 프로덕션 문제를 감지하는데 도움이 됩니다.

    주장은 오직 디버그 빌드에서 체크되지만 전제조건은 디버그와 프로덕션 빌드에서 체크됩니다.

    '기술 > iOS' 카테고리의 다른 글

    Swift 5.6 Control Flow  (0) 2022.02.26
    Swift 5.6 Arrays  (0) 2022.02.26
    Swift 5.6 Strings and Characters  (0) 2022.02.25
    Swift 5.6 Basic Operators  (0) 2022.02.25
    yagom 의 iOS Swift 홈페이지 강좌  (0) 2022.02.19

    TAG

    댓글 0

Designed by Tistory.