소소한개발팁
article thumbnail
Published 2021. 12. 4. 19:35
(Swift) 0. The Basics 컴퓨터 언어/Swift
반응형

Constants and Variables

 - Swift에서 상수는 let 변수는 var 를 사용하며 상수를 사용하는 게 성능면에서 유리합니다.

 

 - 또한 생성시 , 를 통해 한 줄에 여러 상수 또는 변수를 선언 가능합니다.  

   ex) var apple = 10, banana = 20, melon = 30 

 

변수

 

var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome is now "Bonjour!"

 

상수

 

let languageName = "Swift"
languageName = "Swift++"
// This is a compile-time error: languageName cannot be changed.

 

 

Type Annotations

 - 실제로 유형을 작성하지 않고도 값을 초기화가 할 수 있지만 유형을 선언하는 게 성능면에서 유리합니다.

   ex) var message : String  // <- 해당 방식

 

 또한 이 역시 한번에 유형을 정의할 수 있습니다.

   ex) let red, green, blue : Double

 

Naming Constants and Variables

 - 상수 및 변수 이름에는 공백 문자, 숫자 기호, 화살표, 전용 유니코드 스칼라 값 또는 선 및 상자 그리기 문자를 사용할 수 없으며, 숫자가 이름의 다른 곳에 포함될 수 있지만 숫자로 시작은 불가능합니다.

 

 

Printing Constants and Variables

- Swift 에서도 print 함수를 사용해서 출력을 할 수 있으며 변수 값에 담긴 값을 문자열에 포함시킬 때는 

\()를 사용합니다.

 

출력

 

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

 

- 위에서 friendlyWelcome라는 변수에 Bonjour라는 문자열을 추가했었습니다. 이와 같이 \()를 사용하여 출력할 수 있습니다.

 

 

Comments

- 한줄 주석은 두 개의 슬래시(//)

- 여려줄 주석은 슬래시와 별표로 시작(/*) 별표와 슬래시로 종료(*/)

 

 

Semicolons

- 처음 공부할 때 익숙하지 않은 부분 중 하나인데 세미콜론으로 꼭 마무리를 할 필요가 없습니다. 대신 한 줄에 여러 개의 명령문을 작성할 경우에는 꼭 작성해줘야 합니다.

 

ex) var cat = 100 ; print(cat)

  // Prints 100

 

 

Integers

 - Swift에서는 8, 16, 32, 64비트 형식의 부호 있는 정수와 부호 없는 정수를 제공합니다.

 

 ex)    8비트 부호 없는 정수의 유형이 UInt8 

         32비트 부호 있는 정수의 유형이 Int32

 

 - 이런 정수 유형은 이름이 대문자로 시작됩니다.

  • 32비트 플랫폼에서 Int는 와 크기가 같습니다 Int32.
  • 64비트 플랫폼에서 Int는 와 크기가 같습니다 Int64.

 - 특정 크기의 정수로 작업해야 하는 경우가 아니면 항상 Int코드에서 정수 값에 사용하십시오. 이것은 코드 일관성과 상호 운용성을 돕습니다. 32비트 플랫폼 Int에서도 -2,147,483,648 및 사이의 모든 값을 저장할 수 있으며 2,147,483,647 많은 정수 범위에 대해 충분히 큽니다.

 

 

Integer Bounds

- min 및 max 속성을 사용하여 각 정수 유형의 최소값 및 최댓값에 접근 가능합니다. 

 

let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8

 

 

UInt

- Swift는 현재 플랫폼의 기본 단어 크기와 동일한 크기를 갖는 unsigned 정수 유형을 제공합니다.

  • 32비트 플랫폼에서 UInt는 와 크기가 같습니다 UInt32.
  • 64비트 플랫폼에서 UInt는 와 크기가 같습니다 UInt64.

 

 

Floating-Point Numbers

- 부동 소수점 유형은 정수 유형보다 훨씬 더 넓은 범위의 값을 나타낼 수 있으며 에 저장할 수 있는 것보다 훨씬 크거나 작은 숫자를 저장할 수 있습니다.

  • Double 64비트 부동 소수점 숫자를 나타냅니다.
  • Float 32비트 부동 소수점 숫자를 나타냅니다.

- Double의 정밀도는 최소 15자리 소수점 이하 자릿수인 반면  Float의 정밀도는 최소 6자리 소수점 이하 자릿수입니다. 사용할 적절한 부동 소수점 유형은 코드에서 작업해야 하는 값의 특성과 범위에 따라 다릅니다. 두 유형 중 하나가 적절한 상황에서는 Double이 선호됩니다.

 

 

Type Safety and Type Inference

- Swift는 유형이 안전하기 때문에 코드를 컴파일할 때 유형 검사를 수행하고 일치하지 않는 유형을 오류로 플래그 지정합니다.

- 예를 들어, 어떤 유형인지 정하지 않고 새 상수에 의 리터럴 값을 할당하면 Swift는 Int정수처럼 보이는 숫자로 초기화했기 때문에 Int 타입으로 추론합니다.

 

let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int

 

- 마찬가지로, 부동 소수점 리터럴에 대한 유형을 지정하지 않으면 Swift는 다음을 Double 타입으로 생성하고 싶다고 추론합니다.

 

let pi = 3.14159
// pi is inferred to be of type Double

 

- Swift는 부동 소수점 숫자의 유형을 유추할 때 항상 Double(대신 Float)을 선택합니다.

 

- 정수와 부동 소수점 리터럴을 결합하면 콘텍스트에서 Double 유형으로 유추됩니다.

 

let anotherPi = 3 + 0.14159
// anotherPi is also inferred to be of type Double

 

 

Numeric Literals

- 정수 리터럴 17의 값은 

 

let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation

 

- 부동 소수점 리터럴은 10진수와 16진수(0x)로 표현되며 소수점 양쪽에는 항상 숫자가 있어야 합니다. 16진수 부동 소수점은 지수가 있어야 하기 때문에 대문자 또는 소문자 p로 표시됩니다.

 

- 지수가 exp인 십진수의 경우 기본 수에 10 exp를 곱합니다.

  • 1.25e2는 1.25 x 10 2 또는 125.0.
  • 1.25e-2는 1.25 x 10 -2 또는 0.0125.

- 지수가 exp인 16진수의 경우 기본 수에 2 exp를 곱합니다.

  • 0 xFp2는 15 x 2 2 또는 60.0.
  • 0 xFp-2는 15 x 2 -2 또는 3.75.

- 부동 소수점 리터럴의 십진수 값은 12.1875 다음과 같습니다.

 

let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

 

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

 

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

 

 

Type Aliases

-  기존 유형의 대체 이름을 정의합니다. typealias키워드로 유형 별칭을 정의합니다.

 

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

 

 

Booleans

- true와 false의 값을 가집니다.

- 보통 다른 언어에서는 

 

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

 

- 이런 형태로 진행을 했는데 Swift에서는 에러가 발생합니다.

 

let i = 1
if i == 1 {
// this example will compile successfully
}

 

이런 형태로 비교를 진행하면 됩니다.

 

 

Tuples

- 튜플은 여러 값을 단일 복합 값으로 그룹화합니다. 튜플 내의 값은 모든 유형이 될 수 있으며 서로 동일한 유형일 필요는 없습니다.

 

let http404Error = (404, "Not Found")
// http404Error is of type (Int, String), and equals (404, "Not Found")

 

- 튜플 사용 시 

 

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"

 

- 또한 인덱스 번호를 사용하여 개별 요소 값에 접근할 수 있습니다.

 

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"

 

- 튜플은 관련된 값의 간단한 그룹에 유용합니다. 복잡한 데이터 구조 생성에는 적합하지 않습니다. 데이터 구조가 더 복잡할 가능성이 있는 경우 튜플이 아닌 클래스 또는 구조체로 모델링하는 걸 추천드립니다.

 

 

Optionals

- 값의 부재에 대처하기 위해 옵셔널을 사용하는 방법의 예를 보여드리겠습니다.

 

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber is inferred to be of type "Int?", or "optional Int"

 

 

Nil

- 특별한 값을 할당하여 선택적 변수를 값이 없는 상태로 설정합니다.

 

var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value

 

- 기본값 없이 선언하는 경우

 

var surveyAnswer: String?
// surveyAnswer is automatically set to nil

 

-  Objective-C에서 nil 은 존재하지 않는 개체에 대한 포인터입니다. Swift에서 nil은 포인터가 아니라 특정 유형의 값이 없다는 것입니다. 

 

 

If Statements and Forced Unwrapping

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

 

if convertedNumber != nil {
  print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."

 

-  Optional에 값 이 포함되어 있다고 확신하면 옵셔널 이름 끝에 느낌표(!)를 추가하여 기본 값에 접근할 수 있습니다.

이를 Optional 값의 강제 언래핑이라고 합니다.

 

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

 

- 존재하지 않는  Optional 값에 접근하는 0 데 사용하려고 하면 런타임 오류가 트리거 됩니다. 사용하기 전에 Optional에 값이 포함되어 있는지 항상 확인해야 합니다.

 

Optional Binding

 

if let constantName = someOptional {
statements
}

 

- 밑에는 위와 같은 형식의 예시입니다.

 

if let actualNumber = Int(possibleNumber) {
     print("The string \"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
     print("The string \"\(possibleNumber)\" couldn't be converted to an integer")
  }
// Prints "The string "123" has an integer value of 123"

 

- 단일 문에 Optional Binding 사용하여 아래와 같이 표현할 수 있습니다.

 

if let firstNumber = Int("4"),
  let secondNumber = Int("42"),
  firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"

if let firstNumber = Int("4") {
  if let secondNumber = Int("42") {
    if firstNumber < secondNumber && secondNumber < 100 {
      print("\(firstNumber) < \(secondNumber) < 100")
     }
  }
}
// Prints "4 < 42 < 100"

 

 

Error Handling

- throws와 do try catch로 처리 가능합니다.

 

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 

- 조건이 참일 때만 동작하는 함수입니다.

 

let age = -3
assert(age >= 0, "A person's age can't be less than zero.")
// This assertion fails because -3 isn't >= 0..

 

 

Preconditions

- 거짓일 가능성이 있을 때마다 전제조건을 사용하여 거짓일 경우 보여줄 메시지를 전달할 수 있는 함수입니다.

 

// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")

 

 

내용은 https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html를 보면서 작성하였고 원문으로 작성된 내용을 옮기다 보니 이상한 부분이 있을 수 있습니다. 자세한 내용은 위의 링크를 확인해주시기 바랍니다.

반응형
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!