스위프트 문법 | 1시간에 정리하는 Swift 문법 리뷰, Swift 강좌 빠른 답변

당신은 주제를 찾고 있습니까 “스위프트 문법 – 1시간에 정리하는 Swift 문법 리뷰, swift 강좌“? 다음 카테고리의 웹사이트 you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Smile Han 이(가) 작성한 기사에는 조회수 13,700회 및 좋아요 220개 개의 좋아요가 있습니다.

Swift 문법
  • 자료형 Swift는 자료형의 자동 할당을 지원한다. …
  • String Interpolation. Swift에서도 Python의 Format과 유사한 방식으로 변수를 출력문에 포함시킬 수 있다. …
  • Type Alais. …
  • 튜플 …
  • Nil과 Optional.

스위프트 문법 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 1시간에 정리하는 Swift 문법 리뷰, swift 강좌 – 스위프트 문법 주제에 대한 세부정보를 참조하세요

알림 : 이 채널의 수익금 전액은 장학금으로 기부합니다.
20:30 func add(x:Int,y:Int)의 함수명은 x,y가 외부/내부매개변수를 겸하므로 add(::)가 아니라 add(x:y:)입니다.
20:57 마지막 줄 print(add(x:10, y:20))은 print(add(10,20))으로 수정해야 합니다.
Swift 문법을 쭉 정리한 리뷰 강좌입니다.
아래 강좌의 8주차까지 12시간 분량의 내용을 빠르게 리뷰한 내용입니다
https://www.youtube.com/watch?v=ytjrk9nWVLE\u0026list=PLJqaIeuL7nuEEROQDRcy4XxC9gU6SYYXb
online swift compiler :
https://www.onlinegdb.com/online_swift_compiler
http://online.swiftplayground.run/
https://repl.it/languages/swift
https://www.jdoodle.com/execute-swift-online/

스위프트 문법 주제에 대한 자세한 내용은 여기를 참조하세요.

[Swift] Swift 기본 문법 정리(1) – Swift의 변수와 상수, 조건문과 …

Swift 기본 문법 정리(1) … Swift에서는 변수(variable)를 var , 상수(constant)를 let 로 사용하고 있습니다. Swift는 언제 어디서 값이 바뀔지 …

+ 여기에 보기

Source: xtring-dev.tistory.com

Date Published: 4/22/2021

View: 2963

Swift 기본문법 | yagom’s Swift Basic – GitHub Pages

Swift 기본문법. 수강대상. 프로그래밍에 대한 기초지식이 있는 컴퓨터관련 전공생; 다른 언어를 사용해 본 프로그래머; (객체지향) 프로그래밍 유경험자 …

+ 여기를 클릭

Source: yagom.github.io

Date Published: 7/5/2021

View: 7334

[0006] Swift 문법정리

들어가기전 이 문서는 swift에 문법적 특징들을 서술하였다. Swift만 안다고 iOS앱을 만들 수 있지않다. ( cocoa touch framework와 XCode 사용법 …

+ 여기에 표시

Source: tech.inswave.com

Date Published: 5/30/2022

View: 7697

[Swift] 스위프트 기초 문법 – (1) 자료형 – velog

[Swift] 스위프트 기초 문법 – (1) 자료형 · Swift · 상수와 변수 · 기본 데이터 타입 · Any, AnyObject, nil · 컬렉션 타입.

+ 여기에 표시

Source: velog.io

Date Published: 1/12/2021

View: 6300

[Swift] 스위프트 기초 문법 – 둥로그

Swift 공부하면서 기본 문법이 정리가 잘 되어 있지 않다고 생각해서,, 강의를 들으면서 정리를 해보려고 한다. ㅎㅇㅌ!

+ 더 읽기

Source: seungchan.tistory.com

Date Published: 8/29/2021

View: 7367

[Swift 기본 문법] Swift를 처음봤을 때 낯선 문법들

[Swift 기본 문법] Swift를 처음보면서 낯설었던 문법들을 찾아보았다 확실히 C, C#, Java 같은 언어만 보다가 Swift라는 언어를 접했을 때 이게 무슨 …

+ 여기를 클릭

Source: etst.tistory.com

Date Published: 11/7/2022

View: 5503

[Swift] 스위프트 문법 특성

Swift 스위프트 문법 특성. 1. 헤더 파일을 작성할 필요가 없다. – 스위프트는 전처리를 위한 헤더 파일이 필요하지 않고, 헤더 파일과 소스 파일이 …

+ 더 읽기

Source: es1015.tistory.com

Date Published: 12/11/2022

View: 2504

[Swift 문법] Swift 공식 문서 정리 – 1 – The Basics

[Swift 문법] Swift 공식 문서 정리 – 1 – The Basics … Swift는 IOS, macOS, watchOS, tvOS를 만들기 위한 새로운 프로그래밍 언어입니다.

+ 여기에 더 보기

Source: icksw.tistory.com

Date Published: 2/1/2022

View: 9894

앨런 Swift문법 마스터 스쿨 (온라인 BootCamp – 2개월과정) | 강의

Swift문법을 제대로 이해, 활용해보고자 하는 철학을 바탕으로 과정이 설계되었습니다. 코딩에 대해 1도 모르는 비전공자를 시작으로 네카라쿠배에 …

+ 여기에 더 보기

Source: www.inflearn.com

Date Published: 8/12/2021

View: 9589

주제와 관련된 이미지 스위프트 문법

주제와 관련된 더 많은 사진을 참조하십시오 1시간에 정리하는 Swift 문법 리뷰, swift 강좌. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

1시간에 정리하는 Swift 문법 리뷰, swift 강좌
1시간에 정리하는 Swift 문법 리뷰, swift 강좌

주제에 대한 기사 평가 스위프트 문법

  • Author: Smile Han
  • Views: 조회수 13,700회
  • Likes: 좋아요 220개
  • Date Published: 2020. 11. 17.
  • Video Url link: https://www.youtube.com/watch?v=R8OWOgCNt4M

Swift 문법 정리 #1

상수와 변수 선언

다른 여타 언어와 마찬가지로, Swift 역시 상수와 변수를 선언할 수 있다. C++에서는 상수와 변수의 차이가 const의 유무에 따라 달라진 반면, Swift에서는 선언하는 방식 자체가 다르다.

# C++ Style const int maximumNumberOfLoginAttempts = 10 int currentLoginAttempt = 0

let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt = 0

상수의 경우 let 키워드를 이용하여 선언할 수 있고, 변수의 경우 var 키워드를 이용하여 선언할 수 있다.

위처럼 한 줄에 하나의 변수를 선언할 수 있지만, 아래와 같이 한 줄에 여러 변수를 선언할 수도 있다.

var x = 0.0 , y = 0.0 , z = 0.0

자료형

Swift는 자료형의 자동 할당을 지원한다. 따라서 위의 예시와 같이 변수의 자료형을 명시하지 않고도 사용할 수 있다. 하지만 실제 프로그래밍을 할 때 명시된 자료형은 생각보다 중요하다(대표적인 예시로 TypeScript).

Swift의 경우 자동 할당을 지원하지만, Python과는 다르게 한번 자료형이 할당된 이후에는 변수의 자료형이 고정된다. 그리고 자료형을 아래와 같이 명시할 수도 있다.

var welcomeMessage : String welcomeMessage = “Hello” var red , green , blue : Double

String Interpolation

Swift에서도 Python의 Format과 유사한 방식으로 변수를 출력문에 포함시킬 수 있다. Python에서는 { } 을 사용하는 반면 Swift에서는 \ ( ) 을 사용한다.

print ( f’The current value is { welcomeMessge } ‘ )

print ( “The current value is \( welcomeMessage ) ” )

Type Alais

C++의 typedef 와 유사하게, Swift에서도 자료형의 별명을 정의할 수 있는 키워드를 제공한다. Swift에서는 typealias 를 사용하여 자료형의 별명을 정의할 수 있다.

typealias AudioSample = UInt16

튜플

Swift 역시 다른 언어들과 마찬가지로 튜플 자료형을 지원한다. 튜플은 ( ) 를 통해서 값을 표현한다. 그리고 변수에 값을 할당할 때, 만약 2개의 다른 변수에 하나의 튜플 값을 각각 할당해주고 싶다면 아래와 같이 할 수 있다.

let http404Error : ( Int , String ) = ( 404 , “Not Found” ) let ( statusCode , statusMessage ) = http404Error print ( “The status code is \( statusCode ) ” ) print ( “The status Message is \( statusMessage ) ” )

그리고 만약 튜플에서 하나의 값만 변수에 할당해주고 싶다면, 아래와 같이 사용할 수 있다.

let ( justTheStatusCode , _ ) = http404Error

마치 C++의 pair 과 유사해보인다. 하지만 다른 점이 있는데, Swift의 튜플은 pair와 다르게 2개보다 많은 값을 가질 수 있다.

let james = ( “James” , “Male” , “010-1234-5678” )

대소 비교의 경우 pair와 유사한 방식으로 동작한다. 같은 개수의 값과 자료형을 가진 튜플들의 경우 대소비교가 가능한데, 이 경우 왼쪽부터 오른쪽까지 값을 하나씩 비교해 나간다.

print ( ( 1 , “zebra” , – 1 ) < ( 2 , "apple" , - 1 ) ) print ( ( 3 , "apple" ) < ( 3 , "bird" ) ) print ( ( 4 , "dog" ) == ( 4 , "dog" ) ) print ( ( "blue" , false ) < ( "purple" , true ) ) 단, 대소비교가 불가능한(예. Bool) 값이 있을 경우 아무리 해당 값에 도착하기 전에 대소비교가 가능하더라도 오류가 난다. 위의 경우 이미 "blue"와 "purple"만으로도 대소비교가 가능하지만, 그 다음의 값이 Boolean이기 때문에 오류가 나게 된다. Swift에서 Bool은 대소비교가 불가능한 자료형이다. Nil과 Optional 원래 Objective-C에서 nil은 객체 참조에 사용되었고, null은 그외 다른 값들을 참조하는데 사용했었다. 하지만 Swift에는 null이 존재하지 않는다. 이는 Objective-C에서 Swift로 넘어오면서 null과 nil 중 nil만 가져왔기 때문이다. Swift에서 nil은 값이 없는 상태(valueless state)를 의미한다. Optional 은 값이 없을 수도 있다는 것을 의마한다. 예를 들어, 어떤 변수가 주어졌을 때 해당 변수가 값을 반드시 지닌다는 것을 보장하지 못하는 경우, Optional을 사용하여 표현할 수 있다. var serverResponseCode : Int ? = 404 serverResponseCode = nil 위 코드를 보면 ? 를 사용하여 Optional을 명시한 것을 알 수 있다. 그리고 nil의 경우 반드시 Optional 타입의 변수에만 사용할 수 있다. 그리고 조건문 없이 간단하게 nil 여부를 판단하여 원하는 값을 변수에 저장할 수 있다. let defaultColor = "red" var userDefinedColor : String ? var colorToUse = userDefinedColor ? ? defaultColor print ( colorToUse ) 위 코드는 userDefinedColor 변수의 상황에 따라 colorToUse 변수에 다른 값이 저장된다. 만약 userDefinedColor이 nil이라면 뒤 쪽의 defaultColor의 값이 할당되며, 그렇지 않은 경우 userDefinedColor의 값이 할당된다.

[Swift] Swift 기본 문법 정리(1) 🧾

반응형

Swift 기본 문법 정리(1) 🧾

전수열님의 GitBook을 기반으로 정리합니다.

변수와 상수

Swift에서는 변수(variable)를 var , 상수(constant)를 let 로 사용하고 있습니다.

Swift는 언제 어디서 값이 바뀔지 모르는 변수보다는 상수를 사용하는 것을 권장합니다.

var name = “Hwang Hyun” let birthyear = 1994

변수는 값의 변경이 가능합니다!

name = “Mark”

하지만 아래와 같이 상수의 값을 변경하려고 하면 컴파일 에러가 발생합니다!

birthyear = 20000 // Compile Error!

Cannot assign to value: ‘birthyear’ is a ‘let’ constant

정적 타이핑

Swift는 정적 타입핑 언어 입니다. 변수나 상수를 정의할 때 그 자료형(타입)이 어떤 것인지를 명시해주어야 하는 언어를 말합니다.

var name: String = “Mark” let birthyear: Int = 1994 var height: Float = 180.3

변수와 상수명 오른쪽에 : String , : Int , : Float 와 같이 변수에 담길 값의 타입을 지정해주는 것을 정적 타입핑 한다라고 합니다.

그리고 : String 를 Type Annotation 이라고 합니다.

Swift에서는 타입을 매우 엄격하게 다루기 때문에 다른 자료형끼리는 기본적인 연산조차 되지 않습니다.

birthyear + height // Compile Error!

Binary operator ‘+’ cannot be applied to operands of type ‘Int’ and ‘Float’

이를 해결하는 방법은 강제로 형을 변환하여 사용하는 것입니다.

Float(birthyear) + height // 2174.3

Swift에서 문자열에 변수를 넣는 방법은 아래와 같습니다.

String(birthyear) + “년에 태어난 ” + name + “아 안녕!” // 1994년에 태어난 Mark야 안녕!

이렇게 사용하면 가독성이 조금은 떨어지는 것 같습니다. Swift에는 조금 더 간결한 작성법이 있습니다!

“\(birthyear)에 태어난 \(name)아 안녕!”

타입 추론(Type Inference)

맨 처음에 사용한 예제에서는 자료형을 명시하지 않았는데도 name 이 문자열이라는 것을 알았으며 birthyear 가 정수형이라는 것을 알았습니다.

var name = “Hwang Hyun” let birthyear = 1994

이게 어떻게 가능할까요?

Swift는 큰 따옴표( “” )로 감싸진 텍스트는 String 타입인 것을 알고, 숫자는 Int 타입인 것을 추론합니다. 이 처럼 타입을 직접 명시하지 않아도 정적 타입핑을 할 수 있게 해주는 것을 타입 추론(Type Inference) 라고 합니다.

배열(Array)과 딕셔너리(Dictionary)

배열과 딕셔너리는 모두 대괄호( [] )를 이용해서 정의할 수 있습니다.

var languages = [“Swift”, “Objective-C”, “Python”] var capitals = [ “한국”: “서울”, “일본”: “도쿄”, “중국”: “베이징”, ]

배열과 딕셔너리의 값에 접근해 봅시다.

languages[0] // Swift languages[1] = “Ruby” capitals[“한국”] // 서울 capitals[“프랑스”] = “파리”

배열과 딕셔너리 역시 let 으로 정의하면 값을 수정(수정/추가/제거)할 수 없습니다.

만약 빈 배열이나 딕셔너리를 정의하는 방법은 아래와 같습니다.

var languages: [String] = [] var capitals: [String: String] = [:]

빈 배열로 선언하는 것을 조금 더 간결하게 하고싶다면, 아래와 같습니다.

var languages = [String]() var capitals = [String: String]()

대괄호 뒤에 괄호( () )를 쓰는 것은 생성자(Initializer)를 호출하는 것입니다.

조건문과 반복문

조건을 검사할 때는 if , swift 를 사용합니다.

var age = 19 var student = “” if age >= 8 && age < 14 { student = "초등학생" } else if age < 17 { student = "중학생" } else if age < 20 { student = "고등학생" } else { student = "기타" } student // 고등학생 if 문의 조건절에는 값이 정확하게 참 혹은 거짓으로 나오는 Bool 타입을 사용해야 합니다. Swift는 타입 검사를 매우 엄격하게 하기 때문에, 다른 언어에서 사용 가능한 아래 코드를 사용할 수 없습니다. var number = 0 if !number { // Compile Error! // ... } Unary operator '!' cannot be applied to an operand of type 'Int' 대신, 아래와 같이 사용이 가능합니다. if number == 0 { // ... } 빈 문자열이나 배열 등을 검사할 때에도 명확하게 길이가 0인지를 검사해야 합니다. .isEmpty 메소드 사용 if name.isEmpty { ... } if languages.isEmpty { ... } Swift의 switch 문에는 조금 특별한 점이 있습니다. 패턴 매칭을 통해 범위에 포함시킬 수 있습니다. switch age { case 8..<14: student = "초등학생" case 14..<17: student = "중학생" case 17..<20: student = "고등학생" default: student = "기타" } 8..<14 와 같이 범위(Range) 안에 age가 포함되어 있는지 검사할 수 있습니다. 반복되는 연산을 할 때에는 for , while 을 사용합니다. for 구문을 사용해서 배열과 딕셔너리를 차례로 순환할 때에는 아래와 같이 사용합니다. // Array를 for문에서 사용하기 for language in languages { print("저는 \(language) 언어를 다룰 수 있습니다.") } // Dictionary를 for문에서 사용하기 for (country, capital) in capitals { print("\(country)의 수도는 \(capital)입니다.") } 간단한 반복문을 만드록 싶다면 범위를 만들어서 반복시킬 수도 있습니다. for i in 0..<100 { i } 만약 i를 사용하지 않는 단순 반복문은 i 대신 _ 를 사용할 수 있습니다. for _ in 0..<10 { print("Hello!") } _ (underscore) 키워드는 어디서나 변수 이름 대신에 사용할 수 있습니다. while 은 조건문의 값이 true 일 때 계속 반복됩니다. var i = 0 while i < 100 { i += 1 } 옵셔널(Optional) Swift가 가진 가장 큰 특징 중 하나가 옵셔널(Optional)입니다. 직역하면 '선택적인'이라는 뜻입니다. 이는 값이 있을 수도 있고 없을 수도 있다는 것을 나타냅니다. "swift", ""는 값이 있는 것이며 ""는 빈 문자열 입니다. 값이 없는 문자열은 nil 입니다. 정수형의 경우 123, 0은 값이 있는 것입니다. 0도 숫자값이죠. 없는 값의 경우 nil 이라고 표현합니다. 마찬가지로 빈 배열과 빈 딕셔너리라고 해서 '값이 없는' 것이 아닌 '비어 있을' 뿐입니다. 배열과 딕셔너리의 경우에도 '없는 값'은 nil 입니다. 값이 없는 경우 nil 을 사용합니다. 하지만 모든 변수에 nil 을 넣을 수 있는 것은 아닙니다. var name: String = "Mark" name = nil // Compile Error Nil cannot be assigned to type 'String' 값이 있을 수도 있고 없을 수도 잇는 변수를 정의할 때는 타입 어노테이션 에 ? 를 붙여야 합니다. 이렇게 정의한 변수를 옵셔널(Optional)이라고 합니다. 옵셔널에 초깃값을 지정하지 않으면 기본값은 nil 입니다. var email: String? print(email) // nil email = "[email protected]" print(email) // Optional("[email protected]") 옵셔널로 정의한 변수는 옵셔널이 아닌 변수와는 다릅니다. 예를 들어, 아래와 같은 코드는 사용할 수 없습니다. let optionalEmail: String? = "[email protected]" let requiredEmail: String = optionalEmail // Compile Error requiredEmail 변수는 옵셔널이 아닌 String 이기 때문에 항상 값을 가지고 있어야 합니다. 하지만 optionEmail 은 옵셔널로 선언된 변수이기 때문에 실제 코드가 실행되기 전까지 값이 있는지 없는지 알 수 없습니다. 따라서 Swift 컴파일러는 안전을 위해 requiredEmail 에는 옵셔널로 선언된 변수를 대입할 수 없게 만들었습니다. 옵셔널은 개념적으로 아래와 같이 표현 가능합니다. 어떤 값 또는 nil 을 가지고 있습니다. ,-- 어떤 값 (String, Int, ...) Optional `-- nil 옵셔널 바인딩(Optional Binding) 옵셔널의 값을 가져오고 싶은 경우에는 옵셔널 바인딩(Optional Binding)을 사용합니다. 옵셔널 바인딩은 옵셔널의 값이 존재하는지를 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입시켜줍니다. if let 또는 if var 를 사용하며 옵셔널을 벗겨서 값이 있으면( nil 이 아니면) if 문 안으로 들어가고, 값이 nil 이라면 그냥 통과하게 됩니다. 예를 들어 아래 코드에서 optionalEmail 에 값이 존재한다면 email 이라는 변수 안에 실제 값이 저장되고, if 문 내에서 그 값을 사용할 수 있습니다. 만약 optionalEmail 이 nil 이라면 if 문이 실행되지 않고 넘어갑니다. if let email = optionalEmail { print(email) // optionalEmail의 값이 존재한다면 해당 값이 출력됩니다. } // optionalEmail의 값이 존재하지 않는다면 if문을 그냥 지나칩니다. 하나의 if 문에서 콤마( , )로 구분하여 여러 옵션을 바인딩할 수 있습니다. 이곳에 사용된 모든 옵셔널의 값이 존재해야 if 문 안으로 진입합니다. var optionalName: String? = "Mark" var optionalEmail: String? = "[email protected]" if let name = optionalName, email = optionalEmail { // name과 email 값이 존재 } 아래의 방법은 위 예시와 같습니다. if let name = optionalName, let email = optionalEmail { // name과 email 값이 존재 } 두번째 let 부터는 생략이 가능합니다. 또한 , 를 사용하여 옵셔널 바인딩이 일어난 후 조건을 검사하게 됩니다. var optionalAge: Int? = 22 if let age = optionalAge, age >= 20 { // age의 값이 존재하고, 20 이상입니다. }

위와 동일합니다.

if let age = optionalAge { if age >= 20 { // age의 값이 존재하고, 20 이상입니다. } }

옵셔널 체이닝(Optional Chaining)

Swift의 옵셔널 체이닝을 사용하면 값이 빈 값을 가지고 있는지 쉽게 확인이 가능합니다. 예시를 살펴봅니다.

아래 코드는 옵셔널 체이닝을 사용하지 않는 경우입니다.

let array: [String]? = [] var isEmptyArray = false if let array = array, array.isEmpty { isEmptyArray = true } else { isEmptyArray = false } isEmptyArray

옵셔널 체이닝을 사용하면 이 코드를 더 간결하게 사용가능합니다.

let isEmptyArray = array?.isEmpty == true

옵셔널 체이닝은 옵셔널의 속성에 접근할 때, 옵셔널 바인딩 과정을 ? 키워드로 줄여주는 역할을 합니다.

array 가 nil 인 경우

array?.isEmpty // array?까지 실행되고 nil을 반환

array 가 빈 배열인 경우

array?.isEmpty // array?.isEmpty까지 실행되고 `true`를 반환

array 에 요소가 있는 경우

array?.isEmpty // array?.isEmpty까지 실행되고 `false`를 반환

위의 결과에서 볼 수 있듯이 결과로 나올 수 있는 값은 nil , true , false 가 있습니다.

isEmpty 의 반환값은 Bool 인데, 옵셔널 체이닝으로 인해 Bool? 을 반환하도록 바뀐 것이죠. 따라서 값이 실제로 true 인지 확인하려면, == true 를 해주어야 합니다.

옵셔널 벗기기

옵셔널을 사용할 때마다 옵셔널 바인딩을 하는 것이 가장 바람직합니다. 하지만 분명히 값이 존재하는 변수임에도 불구하고 옵셔널로 사용해야 하는 경우가 있으며 이때 옵셔널 벗기기를 해야합니다. 옵셔널에 값이 있다고 가정하고 값에 바로 접근할 수 있도록 도와주는 키워드인 ! 를 붙여서 사용하면 됩니다.

print(optionalEmail) // optional(“[email protected]”) print(optionalEmail!) // [email protected]

! 를 사용할 때는 반드시 주의해야합니다. 만약 옵셔널 값이 nil 인 경우 런타임 에러가 발생하며 iOS 앱은 강제로 종료(크레시)됩니다.

var optionalEmail: String? print(optionalEmail!) // Runtime Error: optionalEmail is nil

fatal error: unexpectedly found nil while unwrapping an Optional value

암묵적으로 벗겨진 옵셔널(Implicitly Unwrapped Optional)

만약 옵셔널을 정의할 때 ? 대신 ! 를 붙이면 ImplicitlyUnwrappedOptional 이라는 옵셔널로 정의됩니다. 이를 ‘암묵적으로 벗겨진 옵셔널’이라고 합니다.

var email: String! = “[email protected]” print(email) // [email protected]

이렇게 정의된 옵셔널은 nil 을 포함할 수 있는 옵셔널이지만, 접근할 때 옵셔널 바인딩이나 옵셔널을 벗기능 과정을 거치지 않고도 값에 바로 접근할 수 있다는 점에서 일반적인 옵셔널과 조금 다릅니다.

옵셔널 벗기기와 마찬가지로, 값이 없는데 접근을 시도하면 런타임 애러가 발생합니다.

var email: String! print(email) // Runtime Error!

fatal error: unexpectedly found nil while unwrapping an Optional value

가급적이면 일반적인 옵셔널을 사용해서 정의하고 옵셔널 바인딩 또는 옵셔널 체이닝을 통해 값에 접근하는 것이 바람직합니다.

반응형

[0006] Swift 문법정리

// 클로저형식 { ( 매개변수들 ) -> 반환타입 in 실행코드 } //함수전달예 func backwards ( first : String , second : String ) -> Bool { print ( ” \( first ) \( second ) compare” ) return first > second } let reversed : [ String ] = names . sorted ( by : backwards ) print ( reversed ) //메서드에 클로저전달 let reversed : [ String ] = names . sorted ( by :{ first : String , second : String ) -> Bool in return first > second }) print ( reversed ) //후행클로저표현 //후행클로저 : 함수나 메서드의 마지막인자로 위치하는 클로저는 함수나 메서드의 소괄호를 닫은 후 작성가능 let reversed : [ String ] = names . sorted () { first : String , second : String ) -> Bool in return first > second }

[Swift] 스위프트 기초 문법 – (1) 자료형

직장인이 되고 iOS를 개발하게 되었다. iOS 개발 경험이 조금 있긴하지만, 소프트 랜딩 시간을 통해 기초부터 차근차근 정리해보려한다.

상수와 변수

스위프트는 함수형 프로그래밍의 패러다임을 채용한 언어이므로 불변 객체를 굉장히 중요시 한다.

let 이름 : 타입 = 값 var 이름 : 타입 = 값

값의 타입이 명확하면 타입 생략 가능하지만, 나중에 값을 넣어줄 때는 타입을 꼭 명시해주어야 한다.

let integer = 1 var strings = “hello” let name : String let age : Int name = “ssionii” age = 24

기본 데이터 타입

스위프트는 데이터 타입에 엄격한 언어이다. 따라서 서로 다른 데이터 타입 간의 자료 교환이 굉장히 까다롭다.

Bool

true와 false만 값으로 가진다.

var someBool : Bool = false someBool = true someBool = 1

Int, UInt

Int: 정수 타입. 64비트 정수형

UInt: 양의 정수 타입. 64비트 양의 정수형

var someInt : Int = 100 var someUInt : UInt = 100 someUInt = – 100

Float, Double

Float: 실수 타입. 32비트 부동소수형

Double: 실수 타입. 64비트 부동소수형

var someFloat = 3.14 someFloat = 3 var someDouble = 3.14 someDouble = 3 someDouble = someFloat

Character, String

Character: 문자 타입. 유니코드 사용. 큰따옴표(“”) 사용

String: 문자열 타입. 유니코드 사용. 큰따옴표(“”) 사용

var someCharacter : Character = “가” someCharacter = “a” someCharacter = “hello” var someString : String = “hello” someString = someString + “월드” someString = someCharacter

Any, AnyObject, nil

Any

스위프트의 모든 타입을 지칭하는 키워드

var someAny : Any = 100 someAny = “아무거나 넣을 수 있다” someAny = 123.12 let someDouble = someAny

AnyObject

모든 클래스 타입을 지칭하는 프로토콜

class SomeClass { } var someAnyObject : AnyObject = SomeClass ( ) someAnyObject = 123.12

nil

스위프트에서 ‘없음’을 의미하는 키워드

var someAny : Any var someAnyObject : AnyObject someAny = nil someAnyObject = nil

컬렉션 타입

Array

멤버가 순서(인덱스)를 가진 리스트 형태의 컬렉션 타입. 여러가지 리터럴 문법을 활용할 수 있다.

Array 선언 및 생성

var integers : Array < Int > = Array < Int > ( ) var integers : Array < Int > = [ Int ] ( ) var integers : Array < Int > = [ ] var integers : [ Int ] = Array < Int > ( ) var integers : [ Int ] = [ Int ] ( ) var integers : [ Int ] = [ ] var integers = [ Int ] ( )

Array 활용

integers . append ( 1 ) integers . appned ( 2 ) integers . appned ( 3 ) integers . append ( 123.12 ) integers . contains ( 1 ) integers . contains ( 4 ) integers [ 0 ] = 100 integers . remove ( at : 0 ) integers . removeLast ( ) integers . removeAll ( ) print ( integers . count )

Dictionary

‘키’와 ‘값’의 쌍으로 이루어진 컬렉션 타입. Array와 같이 여러가지 리터럴 문법을 활용할 수 있다.

Dictionary의 선언과 생성

var anyDictionary : Dictionary < String , Any > = [ String : Any ] ( ) var anyDictionary : Dictionary < String , Any > = Dictionary < String , Any > ( ) var anyDictionary : Dictionary < String , Any > = [ : ] var anyDictionary : [ String : Any ] = Dictionary < String , Any > ( ) var anyDictionary : [ String : Any ] = [ String : Any ] ( ) var anyDictionary = [ String : Any ] ( )

Dictionary 활용

anyDictionary [ “someKey” ] = “someValue” anyDictionary [ “anotherKey” ] = 100 anyDictionary = [ “someKey” : “someValue” , “anotherKey” : 100 ] anyDictionary [ “someKey” ] = “dictionary” anyDictionary . removeValue ( forKey : “anotherKey” ) anyDictionary [ “someKey” ] = nil

Set

중복되지 않는 멤버가 순서 없이 존재하는 컬렉션. Array, Dictionary와 달리 축약형이 없다.

Set 선언 및 생성

var integerSet : Set < Int > = Set < Int > ( )

Set 활용

integerSet . insert ( 1 ) integerSet . insert ( 2 ) integerSet . insert ( 99 ) integerSet . insert ( 3 ) integerSet . insert ( 99 ) integerSet . contains ( 1 ) integerSet . contains ( 100 ) integerSet . remove ( 1 ) integerSet . removeFirst ( ) print ( integerSet . count )

멤버의 유일성이 보장되기 때문에 집합 연산에 활용하면 유용하다.

let setA : Set < Int > = [ 1 , 2 , 3 , 4 , 5 ] let setB : Set < Int > = [ 3 , 4 , 5 , 6 , 7 ] let union : Set < Int > = setA . union ( setB ) let orderedUnion : [ Int ] = union . sorted ( ) let intersection : Set < Int > = setA . intersection ( setB ) let subtracting : Set < Int > = setA . subtracting ( setB )

해당 글은 boostcourse의 ‘iOS 프로그래밍을 위한 스위프트 기초’ 강의를 수강한 후 정리한 글입니다.

[Swift] 스위프트 기초 문법

Swift 공부하면서 기본 문법이 정리가 잘 되어 있지 않다고 생각해서,, 강의를 들으면서 정리를 해보려고 한다. ㅎㅇㅌ!

이름짓기 규칙

Lower Camel Case: function, method, variable, constant

Upper Camel Case: type(class, struct, enum, extenstion)

대소문자를 구분 !

콘솔로그

print : 단순 문자열 출력

dump : 인스턴스의 자세한 설명(description 프로퍼티) 까지 출력

문자열 보간법

String inetrpolation

프로그램 실행 중 문자열 내에 변수 또는 상수의 실질적인 값을 표현하기 위해 사용

\()

상수와 변수

//상수, 변수의 선언 //상수 선언 키워드 let //변수 선언 키워드 var //상수의 선언 let 이름: 타입 = 값 //변수의 선언 var 이름: 타입 = 값 //값의 타입이 명확하다면 타입은 생략 가능 let 이름 = 값 var 이름 = 값 let constant: String = “차후에 변경이 불가능한 상수 let” let variable: String = “차후에 변경이 가능한 변수 let” //상수 선언 후 나중에 값 할당하기 //나중에 할당하려고 하는 상수나 변수는 타입을 꼭 명시해야 함. let sum: Int let inputA: Int = 100 let inputB: Int = 200 //선언 후 첫 할당 sum = inputA + inputB sum = 1 //그 이후에는 다시 값을 바꿀 수 없다 -> 오류발생

Any, AnyObject, nil

Any – Swift의 모든 타입을 지칭하는 키워드 AnyObject – 모든 클래스 타입을 지칭하는 프로토콜 nil – 없음을 의미하는 키워드 //Mark: – Any var someAny: Any = 100 someAny = “어떤 타입도 수용 가능하다” someAny = 123.12 //let someDouble: Double = someAny -> 오류 //Mark: – AnyObject class SomeClass {} var someAnyObject: AnyObject = SomeClass() someAnyObject = 123.12 -> 오류 //Mark: – nil someAny = nil -> 오류 someAnyObject = nil -> 오류

컬렉션 타입 (Array, Dictionary, Set)

Array

컬렉션 타입 Array – 순서가 있는 리스트 컬렉션 Dictionary – 키와 값의 쌍으로 이루어진 컬렉션 Set – 순서가 없고, 멤버가 유일한 컬렉션 //Mark: – Array //빈 Int Array 생성 var integers: Array = Array() -> [] integers.append(1) -> [1] integers.append(100) -> [100] integers.contains(100) -> true integers.contains(100) -> false integers.remove(at: 0) -> 1 integers.removeLast() -> 100 integers.removeAll() -> [] integers.count -> 0 //Array와 [Double]는 동일한 표현 //빈 Double Array 생성 var doubles: Array = [Double]() //빈 String Array 생성 var strings: [String] = [String]() //빈 Character Array 생성 //[]는 새로운 빈 Array var characters: [Character] = [] //let을 사용하여 Array를 선언하면 불변 Array let immutableArray= [1, 2, 3]

Dictionary

// Dictionary의 선언과 생성 // Key가 String 타입이고 Value가 Any인 빈 Dictionary 생성 var anyDictionary: Dictionary = [String: Any]() // 위와 동일한 표현 // var anyDictionary: Dictionary = Dictionary() // var anyDictionary: Dictionary = [:] // var anyDictionary: [String: Any] = Dictionary() // var anyDictionary: [String: Any] = [String: Any]() // var anyDictionary: [String: Any] = [:] // var anyDictionary = [String: Any]() // 2. Dictionary 활용 // 키에 해당하는 값 할당 anyDictionary[“someKey”] = “value” anyDictionary[“anotherKey”] = 100 print(anyDictionary) // [“someKey”: “value”, “anotherKey”: 100] // 키에 해당하는 값 변경 anyDictionary[“someKey”] = “dictionary” print(anyDictionary) [“someKey”: “dictionary”, “anotherKey”: 100] // 키에 해당하는 값 제거 anyDictionary.removeValue(forKey: “anotherKey”) anyDictionary[“someKey”] = nil print(anyDictionary) -> [:] // 3. 불변 Dictionary: let을 사용하여 Dictionary 선언 let emptyDictionary: [String: String] = [:] let initalizedDictionary: [String: String] = [“name”: “yagom”, “gender”: “male”] // 불변 Dictionary이므로 값 변경 불가 //emptyDictionary[“key”] = “value”

Set

// Set 생성 및 선언 var integerSet: Set = Set() // insert : 새로운 멤버 입력 // 동일한 값은 여러번 insert해도 한번만 저장됩니다. integerSet.insert(1) integerSet.insert(99) integerSet.insert(99) integerSet.insert(99) integerSet.insert(100) print(intigerSet) // {100, 99, 1} // contains: 멤버 포함 여부 확인 print(integerSet.contatins(1)) // true print(integerSet.contains(2)) // false // remove: 멤버 삭제 integerSet.remove(99) // {100, 1} integerSet.removeFirst() // {1} // count: 멤버 개수 integerSet.count // 1 // 2. Set의 활용 // 멤버의 유일성이 보장되기 때문에 집합 연산에 활용하면 유용합니다. let setA: Set = [1, 2, 3, 4, 5] let setB: Set = [3, 4, 5, 6, 7] // 합집합 let union: Set = setA.union(setB) print(union) // [2, 4, 5, 6, 7, 3, 1] // 합집합 오름차순 정렬 let sortedUnion: [Int] = union.sorted() print(sortedUnion) // [1, 2, 3, 4, 5, 6, 7] // 교집합 let intersection: Set = setA.intersection(setB) print(intersection) // [5, 3, 4] // 차집합 let subtracting: Set = setA.subtracting(setB) print(subtracting) // [2, 1]

함수 기본

함수 선언의 기본 형태

함수 선언의 기본 형태 func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 …) -> 반환타입 { /* 함수 구현부 */ return 반환값 } // sum이라는 이름을 가지고 // a와 b라는 Int 타입의 매개변수를 가지며 // Int 타입의 값을 반환하는 함수 func sum(a: Int, b: Int) -> Int { return a + b }

반환 값이 없는 함수

반환 값이 없는 함수 func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 …) -> Void { /* 함수 구현부 */ return } // 예) func printMyName(name: String) -> Void { print(name) } // 반환 값이 없는 경우, 반환 타입(Void)을 생략 가능 func printYourName(name: String) { print(name) }

매개변수가 없는 함수

매개변수가 없는 함수 func 함수이름() -> 반환타입 { /* 함수 구현부 */ return 반환값 } // func maximumIntegerValue() -> Int { return Int.max }

매개변수와 반환값이 없는 함수

매개변수와 반환값이 없는 함수 func 함수이름() -> Void { /* 함수 구현부 */ return } // 함수 구현이 짧은 경우 // 가독성을 해치지 않는 범위에서 // 줄바꿈을 하지 않고 한 줄에 표현해도 무관합 func hello() -> Void { print(“hello”) } // 반환 값이 없는 경우, 반환 타입(Void)을 생략 가능 func 함수이름() { /* 함수 구현부 */ return } func bye() { print(“bye”) }

함수의 호출

함수의 호출 sum(a: 3, b: 5) // 8 printMyName(name: “yagom”) // yagom printYourName(name: “hana”) // hana maximumIntegerValue() // Int의 최댓값 hello() // hello bye() // bye

함수 고급

매개변수 기본값

매개변수 기본값 매개변수에 기본적으로 전달될 값을 미리 지정해 둘 수 있다. 기본값을 갖는 매개변수는 매개변수 목록 중 뒤쪽에 위치하는 것이 좋다. func 함수 이름(매개변수1 이름: 매개변수1 타입, 매개변수2 이름: 매개변수 타입 = 매개변수 기본값../) -> 반환타입 { // 함수 구현부 return 반환값 } func greeting(friend: String, me: String = “seungchan”){ print(“Hi \(friend) I’m \(me)”) } 매개변수 기본값을 가지는 매개변수는 호출 시 생략 가능 greeting(friend: “hana”) greeting(friend: “john”, me: “eric”)

전달인자 레이블

전달인자 레이블 함수를 호출할 때 함수 사용자의 입장에서 매개변수의 역할을 좀 더 명확하게 표현하고자 할 때 사용 전달인자 레이블은 변경하여 동일한 이름의 함수를 중복으로 생성 가능 func 함수이름(전달인자 레이블 매개변수1 이름: 매개변수1 타입…) -> 반환 타입 { // 함수 구현부 return 반환값 } 함수 내부에서 전달인자를 사용할 때에는 매개변수 이름을 사용 func greeting(to friend: String, from me: String)}{ print(“Hello”) } 함수를 호출할 때에는 전달인자 레이블을 사용해야 함. greeting(to: “hana”, from: “seungchan”)

가변 매개변수

가변 매개변수 전달 받을 값의 개수를 알기 어려울 때 사용 가변 매개변수는 함수당 하나만 가질 수 있음 기본값이 있는 매개변수와 같이 가변 매개변수 역시 매개변수 목록 중 뒤쪽에 위치하는 것이 좋음 //func 함수이름(매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입…) -> 반환타입 { // /* 함수 구현부 */ // return //} func sayHelloToFriends(me: String, friends: String…) -> String { return “Hello \(friends)! I’m \(me)!” } print(sayHelloToFriends(me: “seungchan”, friends: “hana”, “eric”, “wing”)) // Hello [“seungchan”, “eric”, “wing”]! I’m seungchan! print(sayHelloToFriends(me: “seungchan”)) // Hello []! I’m seungchan!

데이터 타입으로서의 함수

데이터 타입으로서의 함수 스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어이므로 스위프트의 함수는 일급객체이다. 함수를 변수, 상수에 할당이 가능하고, 매개변수를 통해 전달할 수 있다. 함수의 타입 표현: 반환 타입을 생략할 수 없다. (매개변수1 타입, 매개변수2 타입…) -> 반환타입 var someFunction: (String, String) -> Void = greeting(to:from:) someFunction(“eric”, “seungchan”) // Hello eric! I’m seungchan someFunction = greeting(friend:me:) someFunction(“eric”, “seungchan”) // Hello eric! I’m seungchan // 타입이 다른 함수는 할당할 수 없습니다 – 컴파일 오류 발생 //someFunction = sayHelloToFriends(me: friends:) func runAnother(function: (String, String) -> Void) { function(“jenny”, “mike”) } // Hello jenny! I’m mike runAnother(function: greeting(friend:me:)) // Hello jenny! I’m mike runAnother(function: someFunction)

조건문

if-else

if-else 구문 1. if만 단독으로 사용해도 되고, else, else if 와 조합해서 사용 가능 2. if 뒤의 조건 값에는 Bool 타입의 값만 위치해야 함. 3. 조건을 감싸는 소괄호는 선택사항 if 조건 { /* 실행 구문 */ } else if 조건 { /* 실행 구문 */ } else { /* 실행 구문 */ } if-else 의 사용 let someInteger = 100 if someInteger < 100 { print("100 미만") } else if someInteger > 100 { print(“100 초과”) } else { print(“100”) } // 100 // 스위프트의 조건에는 항상 Bool 타입이 들어와야 합니다. // someInteger는 Bool 타입이 아닌 Int 타입이기 때문에 // 컴파일 오류가 발생합니다. //if someInteger { }

switch case

switch 구문 1. 기본적으로 사용하던 정수타입의 값만 비교하는 것이 아니라 대부분의 스위프트 기본 타입을 지원하며, 다양한 패턴과 응용이 가능 2. 각각의 case 내부에는 실행가능한 코드가 반드시 위치해야 함. 3. 매우 한정적인 값 (enum의 case 등)이 비교값이 아닌 한 default 구문은 반드시 작성해야 함. 4. 명시적 break를 하지 않아도 자동으로 case마다 break 됨. 5. fallthrough 키워드를 사용하여 break를 무시할 수 있음. 6. 쉼표(,)를 사용하여 하나의 case에 여러 패턴을 명시할 수 있음. switch 비교값 { case 패턴: /실행구문/ default: /실행구문/ } // 범위 연산자를 활용하면 더욱 쉽고 유용 switch someInteger { case 0: print(“zero”) case 1..<100: print("1~99") case 100: print("100") case 101...Int.max:print("over 100") default: print("unknown") } // 100 // 정수 외의 대부분의 기본 타입을 사용할 수 있다 switch "seungchan" { case "jake": print("jake") case "mina": print("mina") case "yagom": print("seungchan!!") default: print("unknown") } // seungchan!! 반복문 for-in 구문 기존 언어의 for-each 구문과 유사 Dictionary의 경우 이터레이션 아이템으로 튜플이 들어옴. for-in 구문 기본 형태 for item in items { /실행 구문/ } var integers = [1, 2, 3] let people = ["yagom": 10, "eric": 15, "mike": 12] for integer in integers { print(integer) } // Dictionary의 item은 key와 value로 구성된 튜플 타입입니다 for (name, age) in people { print("\(name): \(age)") } while 구문 while 조건 { /실행 구문/ } while integers.count > 1 { integers.removeLast() }

repeat – while 구문

기존 언어의 do-while 구문과 형태/동작이 유사 repeart { /실행 구문/ } while 조건 repeat { integers.removeLast() } while integers.count > 0

옵셔널

옵셔널이란 ?

값이 있을 수도, 없을 수도 있음을 표현

nil이 할당 될 수 있는지 없는지 표현

// someOptionalParam에 nil이 할당 될 수 있다. func someFunction(someOptionalParam: Int?) { // …. } /// someOptionalParm에 nil이 할당 될 수 없다. func someFunction(someOptionalParam: Int) { // …. } someFunction(someOptionalParam: nil) // someFunction(someParam: nil)

옵셔널을 쓰는 이유

명시적 표현

1. nil의 가능성을 코드만으로 표현 가능

2. 문서/주석 작성 시간 절약

안전한 사용

1. 전달 받은 값이 옵셔널이 아니라면 nil체크를 하지 않고 사용 가능

2. 예외 상황을 최소화 하는 안전 코딩

3. 효율적 코딩

옵셔널 문법과 선언

옵셔널 문법 = enum + general

옵셔널 선언

enum Optional: ExpressibleByNiliteral { case none case some(Wrapped) } let optionalValue: Optional = nil let optionalValue: Int? =nil

옵셔널 표현

느낌표(!)를 이용한 암시적 추출 옵셔널

// Implicitly Unwrapped Optional var implicitlyUnwrappedOptionalValue: Int! = 100 switch implicitlyUnwrappedOptionalValue { case .none: print(“This Optional variable is nil”) case .some(let value): print(“Value is \(value)”) } // 기존 변수처럼 사용 가능 implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1 // nil 할당 가능 implicitlyUnwrappedOptionalValue = nil // 잘못된 접근으로 인한 런타임 오류 발생 implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1 -> 이미 nil을 선언해서 그 다음 값은 오류 발생

물음표(?)를 이용한 옵셔녈 (일반적인 옵셔널)

// Optional var optionalValue: Int? = 100 switch optionalValue { case .none: print(“This Optional variable is nil”) case .some(let value): print(“Value is \(value)”) } // nil 할당 가능 optionalValue = nil // 기존 변수처럼 사용불가 – 옵셔널과 일반 값은 다른 타입이므로 연산불가 //optionalValue = optionalValue + 1

옵셔널 추출

옵셔널 추출이란?

옵셔녈에 들어있는 값을 사용하기 위해 꺼내 오는 것

옵셔널 방식

옵셔널 바인딩

1. nil 체크 + 안전한 추출

2. 옵셔널 안에 값이 들어있는지 확인하고 값이 있으면 값을 꺼내옴

3. if-let 방식 사용

func printName(_ name: String) { print(name) } v ar myName: String? = nil //printName(myName) // 전달되는 값의 타입이 다르기 때문에 컴파일 오류발생 if let name: String = myName { printName(name) } else { print(“myName == nil”) } var yourName: String! = nil if let name: String = yourName { printName(name) } else { print(“yourName == nil”) } // name 상수는 if-let 구문 내에서만 사용가능합니다 // 상수 사용범위를 벗어났기 때문에 컴파일 오류 발생 //printName(name) // ,를 사용해 한 번에 여러 옵셔널을 바인딩 할 수 있습니다 // 모든 옵셔널에 값이 있을 때만 동작합니다 myName = “seungchan” yourName = nil if let name = myName, let friend = yourName { print(“\(name) and \(friend)”) } // yourName이 nil이기 때문에 실행되지 않습니다 yourName = “hana” if let name = myName, let friend = yourName { print(“\(name) and \(friend)”) } // seungchan and hana

강제추출

옵셔널에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방식

만약 값이 없을 경우(nil) 런타임 오류가 발생하기 때문에 옵셔널 바인딩을 주로 사용

var myName: String? = seungchan var youName: String! = nil printName(myName!) // seungchan myName = nil //print(myName!) // 강제추출시 값이 없으므로 런타임 오류 발생 yourName = nil //printName(yourName) // nil 값이 전달되기 때문에 런타임 오류발생

[Swift 기본 문법] Swift를 처음봤을 때 낯선 문법들

300×250

[Swift 기본 문법] Swift를 처음보면서 낯설었던 문법들을 찾아보았다

확실히 C, C#, Java 같은 언어만 보다가 Swift라는 언어를 접했을 때 이게 무슨의미지? 왜 이런 문법을 쓰지? 같은 생각부터 C#, Java 같은 언어에서 보지 못했던 선언방법이나 키워드를 보면서 Swift 문법을 한번 정리를 해둘 필요가 있다고 느꼈습니다. 다른 강의나 교재의 코드를 베끼면서 공부를 한다해도, 그 의미가 뭔지 알고 읽으면 머리에 남아있겠지만 의미를 모른 채 작동하기만 바라면서 코드를 베끼면 남는건 Xcode의 생김새밖에 없을 것 같더라구요. ㅋㅋㅋ 그래서 남의 코드를 읽으면서 무슨 뜻인지만 파악할 수 있을 정도로 Swift 문법을 정리를 해보려 합니다. 물론 Deep한 영역까지 가는게 아니라 원래 알고있던 C#, Java와 다른 것들중에서 어색한 내용들을 뽑아와보려고 해요. 물론 제가 공부하려고 글을 작성하는 중이지만, 이 글을 읽는 분한테도 도움이 갔으면 좋겠네요!

이름 짓기

– 소문자 카멜케이스 (Lower Camel Case) – 함수, 메서드, 인스턴스 등

– 대문자 카멜케이스 (Upper Camel Case) – 클래스, 구조체, 프로토콜, 열거형 등

여기서 카멜케이스는 단어가 여러개인 경우 첫글자만 대문자로 작성하고, 나머지는 소문자로 작성해서 띄어쓰기 없이 이어붙이는 방법을 말하는것 입니다.

ThisIsUpperCamelCase & thisIsLowerCamelCase

참고로, 별 쓸일은 없을것 같지만 알파벳뿐만 아니라 Unicode에 포함된 문자들도 이름을 지을 때 인식합니다! 막상 다른 문자를 넣으면 어색해서 불편할 것 같긴 하네요.

세미콜론은 옵션!

Swift문법에서 세미콜론( ; )을 붙이는건 선택사항입니다. (파이썬은 대신 들여쓰기로 구분을 하지만 Swift는 괄호가 있죠! 개꿀) 그러나 구글링을 해보니 Objective-C와 왔다갔다를 할 때 세미콜론이 없으면 에러가 발생하기 때문에, ObjC와의 연결을 필요로 한다면 세미콜론을 붙여주어야 한다고 합니다. 또는, 코딩습관이나 들여쓰기(indent)의 편의를 위해 붙여주는 경우도 있다고 합니다.

문자열 출력

print(” 문자열 “) 또는 print(string) 를 통해 출력할 수 있습니다. 이렇게 출력하면 Xcode 하단의 Console 창에서 출력된 결과를 확인할 수 있습니다.

변수와 상수 선언

변수는 기본적으로 var 변수명 : 데이터타입 = 값 의 형식으로 선언할 수 있습니다. 그러나 var 변수명 = 값 으로 코드를 작성해도 Swift의 컴파일러는 알아서 데이터타입를 판단하여 변수의 데이터타입을 지정합니다. (매우 편리해보이네요 ㅋㅋ) 하지만 var 변수명; 변수명 = 값 처럼 선언과 값 대입이 분리되어있는 경우에는 오류가 발생하므로 var 변수명 : 데이터타입; 변수명 = 값 처럼 분리시에는 데이터타입에 대한 명시를 해주어야 합니다.

상수는 let 변수명 : 데이터타입 = 값 의 형식으로 선언할 수 있습니다.

Swift는 이름이 직관적이여서 좋네요. ㅋㅋㅋ var는 변수, let은 상수!

함수 선언

Swift를 처음 볼 때 함수의 모습이 제일 낯설었던걸로 기억해요. 물론 복잡한 함수를 보면 지금도 되게 낯설어요 ㅋㅋㅋㅋ

Swift는 func 라는 키워드를 이용해 함수를 정의합니다.

func 함수명 (매개변수, ~ ) -> 반환형 { 명령어 ; return 반환값 } 가 함수 선언의 기본 형식입니다.

func 함수명 (매개변수명 전달인자레이블:매개변수타입, ~ ) -> 반환형 { 명령어 ; return 반환값 } 의 형식을 띄기도 합니다.

후자의 경우 매개변수에 특별한 이름을 붙여서, 함수 사용시에 더 잘 알아볼 수 있도록 하는 역할을 합니다. 매개변수나 반환이 필요 없는 경우 생략이 가능합니다.

이렇게 newValue, oldValue가 함수를 사용할 때 어떤 값을 인자로 전달해야하는지에 대해 가이드를 제시하면서 작성하기도 편하고, 읽기도 편한 코드를 만들어줍니다. ( 이건 진짜 좋은거같아요… 다 작성하고 코드리뷰하면서 이게 뭘 연결한건지 헷갈리거나 라이브러리에서 가져온 함수들 인자 채울때 계속 비교하면서 했었는데 Swift에서는 읽어보면 다 나오니 편하네요 ㅋㅋㅋ )

IF의 조건문

if의 조건문에는 항상 Boolean 값이 들어가야 합니다. 0이 아닌 값은 모두 참이였던 C와 달리 여기서는 Bool값만 받아들인다고 하네요. 유의해야겠습니다. 또, 조건문을 작성할 때 괄호를 붙이지 않아도 돼요. if 조건문 { } 으로 작성해주면 됩니다.

Switch문

Switch의 조건문에 괄호를 달지 않아도 상관이 없습니다. 또, 각 Case마다 break가 자동 장착되어있습니다. (이건 정말 좋은것같아요 ㅋㅋ) 또, 한 case에 여러 조건을 통해 들어올 수도 있습니다.

switch keyFromKBD { case A : ~ execute ~ case B, C : ~ execute ~ default : ~ execute ~ }

옵셔널 ( ? )

처음에는 이 옵셔널이 무슨 의미인지 잘 몰랐는데 찾아보니까 크게 어려운 의미는 아니네요! 오히려 C#이나 Java를 다루면서 여러번 에러가 터졌던 부분이 이 문법을 통해서 잡아낼 수 있을 것 같다는 생각이 들어요. 찾아보니, Objective-C와의 호환성을 위해 nil 을 계속 쓰면서 옵셔널이라는게 생긴 듯 하네요.

먼저 아무 값도 없는 상태를 Swift에서는 nil 이라고 부릅니다. Null과 비슷한 의미라고 보면 될 것 같아요. 기본적으로 변수에는 이 nil 값이 들어갈 수 없는 상태예요. 정수 + 정수를 계산하기 위해 변수끼리 더했는데, 하나의 값이 nil 이라면 오류가 발생하니, 이런 경우를 방지하기 위해 이런 기능을 만들어둔 것 같아요. 이 상태를 non-optional 이라고 합니다. 그럼 반대로 optional 인 변수는 nil 값이 들어갈 수 있는 변수를 말합니다. 개발자가 여기는 비어있을 수 있다고 명시하는 거죠.

var variable : Int? 처럼 옵셔널 (?)을 붙여주어서 optional 변수로 만들어줄 수 있습니다.

옵셔널과 관련된 기능이 3개정도 있는데 이를 살펴봅시다.

1. 옵셔널 언래핑 ( optional unwrapping )

만약 개발자가 optional로 선언된 변수에 nil 이 아니라 값이 분명히 들어있다고 확신한다면, unwrapping 키워드인 ! 를 통해 값을 꺼낼 수 있습니다. 그러면 var sum = variable! + variable! 처럼 옵셔널로 선언된 변수라도 연산에 사용할 수 있는거죠. 대신 ! 을 썼는데도 불구하고 nil 이 들어있었다면 에러를 일으키므로 주의가 필요합니다. ( 앞에 nil인지 검사 후 사용해도 ㄱㅊ할 듯! )

2. 옵셔널 바인딩 ( optional binding )

! 을 사용하지 않고 새로운 상수를 선언한 뒤 상수에 옵셔널 변수의 값을 넣어보고, nil 이 아니면 연산에 사용하는 방식입니다.

if let nonOptionalVariable = OptionalVariable { 연산 } 의 방식으로 사용합니다.

3. 옵셔널 체이닝 ( optional chaining )

옵셔널 언래핑은 실행 했을때 값이 없으면 에러가 발생하지만, 체이닝은 런타임 에러 대신 nil 값을 반환하는 특징이 있습니다. 따라서 체이닝의 결과는 항상 옵셔널 값이 됩니다.

class Coffee { var caffeine : Caffeine? } class Caffeine { var amountOfCaffeine : Int? = 60 }

위의 커피 예시를 들어보면, 커피가 디카페인 커피라면 카페인이 없을 수도 있으니까 ( 좀 억지인가요 ㅋㅋㅋ ) 옵셔널이라고 봅시다. 그럼 커피의 instance인 coffee 가 있다 할때, coffee.caffeine!.amountOfCaffeine 으로 값에 접근한다면 런타임 에러가 발생할 수 있습니다. 이를 피하기 위해서 coffee.caffeine?.amountOfCaffeine 으로 값에 접근을 하면 값이 없으면 nil 값을 가져올 수 있어 if문 등으로 분기하여 다르게 처리할 수 있습니다. 위 방법으로 caffeine, amountOfCaffeine 두 변수 모두의 옵셔널 바인딩을 처리할 수 있어 덜 번거로워 보이기도 하네요.

확실히 적으면서 자료를 찾아보니, 정리가 좀 되는 것 같네요. 특히 함수와 옵셔널 부분이 이해가 잘 안됐었는데, 해소가 어느정도 돼서 다시 코드를 읽을 수 있을 것 같아요. 기본적인 것만 가져가려고 일부러 더 어려워보이는 건 뺐어요. 필요하면 또 작성하게 되겠네요. ㅋㅋㅋㅋㅋ

만약 위에 이해가 잘 안되거나 하는 부분이 있으면 아래에 달아둔 링크나 구글에 검색해서 읽어보세요! 아니면 댓글로 달아주시면 저도 같이 공부해볼게용!!

참고자료

http://tech.inswave.com/2018/04/02/Swift/

ㄴ 이분이 작성하신 게시글이 항목별로 정리가 정말 잘 되어있어요! 한번 확인해보시길 바랍니다.

http://seorenn.blogspot.com/2014/06/swift-function.html

ㄴ 함수형태에 대해 깔끔히 분류되어 정리되어 있습니다.

http://monibu1548.github.io/2018/05/12/swift-optional/

ㄴ 옵셔널에 대한 설명이 깔끔해요!

320×100

[Swift] 스위프트 문법 특성

반응형

Swift 스위프트 문법 특성

1. 헤더 파일을 작성할 필요가 없다.

– 스위프트는 전처리를 위한 헤더 파일이 필요하지 않고, 헤더 파일과 소스 파일이 통합된 하나의 .swift 파일에서 필요한 내용을 정의하고 사용한다.

– 스위프트는 클래스나 구조체를 선언할 때 정의(Interface)와 구현(Implementation)을 분리하지 않고 통합해서 작성하는 특성이 있다.

2. 대소문자를 구분한다.

– 함수와 메소드, 인스턴스명의 첫 글자는 소문자

– 클래스와 구조체, ㅍ로토콜 등 객체의 첫 글자는 대문자

3. 구문 끝의 세미콜론은 생략 가능하다.

– 한 줄에 하나의 구문을 작성할 때 세미 콜론 생략 가능

– 한 줄에 두 개 이상의 구문을 작성할 때는 세미콜론 생략 불가능

4. 엔트리 포인트(시작점)으로 사용되는 main() 함수가 없다.

– 시스템에서 main() 함수를 호출하는 것을 시작으로 프로그램이 실행되는 Objective-C와는 대조적으로, 스위프트는 엔트리 포인트 함수가 없다.

– 대신 @UIApplicationMain 어노테이션을 사용하여 앱을 시작하는 객체를 지정한다. 하나의 앱에서 @UIApplicationMain 어노테이션이 붙은 객체는 단 하나뿐이어야 한다. (AppDelegate)

5. 문자열뿐만 아니라 문잘 큰따옴표를 사용한다.

– String 타입과 Character 타입 모두 큰따옴표를 사용하고, Character 타입을 사용하려면 반드시 명시해야 한다. 명시적으로 지정해 주지 않으면 타입 추론기에 의해 문자열(String)로 처리된다.

6. import 키워드를 사용하지만, 라이브러리와 프레임워크의 참조 용도이다.

– Objective-C는 다른 파일에 정의된 객체를 참조하려면 반드시 import 구문을 사용해야 개체가 정의된 헤더 파일을 반입해야 한다.

– 스위프트에서 import 구문은 프레임워크나 외부 라이브러리를 사용하기 위한 목적으로만 사용된다.

7. 한 줄 주석, 여러 줄 주석 처리 방식을 모두 사용할 수 있고, 중첩 주석을 사용할 수 있다.

– 한 줄용 주석: //

– 여러 줄용 주석: /* ~ */

8. try ~ catch 방식의 오류 처리를 지원한다.

– 스위프트 초기 버전에는 옵셔널 개념을 사용하도록 권고하며 try ~ catch 방식을 지원하지 않았다.

– Objective-C와의 호환성을 위해 사용하는 코코아 터치 프레임워크에서도 일부 오류 처리 기법이 사용되고 있었다. 때문에, 완전히 오류 처리 기능을 무시하고 옵셔널만을 고집할 수 없어서 try ~ catch 기능을 스위프트2에서 발표했다.

출처: 꼼꼼한 재은씨의 Swift: 문법편

반응형

[Swift 문법] Swift 공식 문서 정리

반응형

안녕하세요 Pingu입니다!

Swift를 처음 공부하는데, 공식 문서를 통해 자세하게 Swift언어에 대해 알아보려고 합니다.

이번 글은 Swift 공식 문서의 첫 번째 단원인 The Basics를 읽고 정리를 해보려고 합니다.

Apple 공식 문서 1단원 The Basics

The Basics

Swift는 IOS, macOS, watchOS, tvOS를 만들기 위한 새로운 프로그래밍 언어입니다. 기초적인 자료형으로는 Int, Double, Float, Bool, String, Array, Set, Dictionary가 있습니다. C언어와 마찬가지로 Swift는 값을 저장하고 참조하기 위해 변수를 사용하고 이름으로 변수를 구분합니다. Swift에는 변수 중에서도 값을 변경할 수 없는 Constant(상수)를 제공하고 이로 인해 C에서 보다 더 많은 기능을 수행할 수 있습니다. Swift에는 Objective-C에서는 볼 수 없는 tuple(튜플) 형식도 제공합니다. 튜플을 사용해서 여러 값을 하나의 값으로 반환할 수도 있습니다. Swift에서는 Optional Type(옵셔널 타입)을 제공하는데, 이는 값이 없을 때를 제어할 수 있습니다. 만약 값이 있다면 값을, 값이 없다면 nil을 사용합니다. 이는 클래스뿐만 아니고 모든 유형에 대해 사용할 수 있습니다. Swift는 type-safe 언어입니다. 즉 사용자가 잘못된 자료형을 사용하면 경고를 줘서 인지하게 해 줍니다. 이는 옵셔널 타입에도 적용됩니다. 예를 들어 일반 String 변수에 옵셔널 String 변수를 사용하려고 하면 오류를 발생시킵니다.

Constants and Variables (상수와 변수)

상수는 한 번 정의되면 값이 절대로 변하지 않는 값을 말하며 변수는 값이 변할 수 있는 값입니다. 상수는 let으로 선언되며 변수는 var로 선언할 수 있습니다.

Declaring Constants ans Variables (상수와 변수의 선언)

let maximumNumberOfLoginAttempts = 10 var currentLoginAttemp = 0

위의 코드처럼 상수, 변수를 선언할 수 있습니다.

var x = 0.0, y = 0.0, z = 0.0

위의 코드처럼 여러 상수나 변수를 한 줄에 선언할 수도 있습니다.

Type Annotations

변수나 상수를 선언할 때 type annotation을 사용할 수 있습니다. 이는 어떠한 자료형으로 변수나 상수를 선언할지 명확하게 하기 위해 사용됩니다.

var welcomeMessage: String

위의 코드처럼 type annotation을 사용할 수 있습니다. 이제 위에서 선언한 welcomeMessage에는 어떠한 String 자료형도 오류 없이 새로 초기화 될 수 있습니다.

welcomeMessage = “Hello”

물론 아까와 같이 여러 변수나 상수를 type annotation을 사용하여 한 줄에 선언할 수 있습니다.

var red, greem, blue: Double

Naming Constants and Variables (상수와 변수에 이름 짓기)

변수와 상수는 유니코드에 있는 모든 문자열로 이름을 지을 수 있습니다.

let π = 3.14159 let 你好 = “你好世界” let 🐶🐮 = “dogcow”

변수와 상수의 이름에는 띄어쓰기(공백)이 존재할 수 없고 수학 기호, 화살표, private-use Unicode scalar values, line- and box- drawing 문자를 사용할 수 없습니다. 또한 숫자로 시작할 수는 없지만 시작 말고 다른 곳에는 포함될 수 있습니다. 한번 상수 혹은 변수로 선언되면 같은 이름으로 다른 상수나 변수를 만들 수 없고 자료형을 바꿀 수도 없습니다. 상수로 선언된 것을 변수로 바꾸거나 변수로 선언된 것을 상수로 바꿀 수도 없죠. 물론 상수에는 한 번 선언된 값이 변경될 수도 없습니다.

Printing Constants and Variables (상수와 변수 출력)

상수나 변수는 print(_:separator:terminator:) 함수로 출력할 수 있습니다.

var friendlyWelcome = “Hello” print(friendlyWelcome)

print 함수는 하나 이상의 값을 콘솔 창에 출력해 주는 함수입니다. separator, terminator에는 default값이 있어 함수를 호출할 때 꼭 매개변수에 무엇인가를 주지 않아도 됩니다. terminator는 종결자라는 의미로 기본적으로 줄 바꿈이 있어 print 함수를 호출하면 줄 바꿈이 되는데, 이를 줄 바꿈 없이 다른 것으로 바꾸고 싶다면 다른 값을 넣어주면 됩니다. (예: print(someValue, terminator: “”)) Swift는 문자열 보간을 사용해서 문자열에 상수나 변수의 현재 값을 출력할 수 있습니다.

print(“The current value of friendlyWelcome is \(friendlyWelcome)”)

위의 코드처럼 백슬래시와 괄호로 문자열 보간을 사용할 수 있습니다.

Comments (주석)

주석을 사용해서 실행되지 않는 텍스트를 추가해서 메모를 하거나 설명을 할 수 있습니다.

// This is a comment.

주석은 위의 코드와 같이 //를 사용하면 해당 줄만 주석 처리됩니다.

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

/*, */로 묶여있는 주석은 여러 줄을 한 번에 주석 처리할 수 있게 해 줍니다. C언어와는 다르게 주석 안에 다른 주석이 중첩될 수 있습니다.

/* This is the start of the first multiline comment. /* This is the second, nested multiline comment. */ This is the end of the first multiline comment. */

Semicolons (;)

다른 몇 개의 언어와 마찬가지로 Swift에서도 코드 마지막에 세미콜론(;)을 쓰지 않아도 됩니다. 근데 정 쓰고 싶다면 써도 된다고 합니다. 하지만 한 줄에 여러 개의 실행문을 쓰고 싶다면 세미콜론을 꼭 써줘야 합니다.

let cat = “🐱”; print(cat) // Prints “🐱”

Integers (정수)

Integers는 42, -23과 같이 분수 성분이 없는 수입니다. 양수, 0, 음수가 정수에 포함됩니다. Swift는 8, 16, 32, 64비트 형식의 부호 있는 정수와 부호 없는 정수를 제공합니다. C언어와 비슷하게 부호 없는 정수는 UInt8과 같이 나타내며 부호 있는 정수는 Int8 같이 나타냅니다. Swift의 모든 타입과 마찬가지로 정수 타입도 대문자로 시작됩니다.

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

Int

대부분의 경우에서 정수형을 사용할 때 크기를 선택할 필요는 없고 Int만 사용하면 됩니다. Int를 사용할 때 컴퓨터가 32비트 플랫폼이라면 Int32로 64비트 플랫폼이라면 Int64로 알아서 정의됩니다. Int32도 -2,147,483,648 ~ 2,147,483,647 사이의 값을 저장할 수 있으므로 충분히 크다고 볼 수 있습니다.

UInt

Swift는 부호가 없는 정수도 제공합니다. 물론 UInt도 Int와 마찬가지로 플랫폼에 따라 알아서 정의됩니다.

Floating-Point Numbers (부동소수점)

부동 소수점 숫자는 3.14159 , 0.1, -273,15 와 같이 분수형 숫자입니다. 부동 소수점 숫자는 정수형 보다 넓은 범위의 값을 나타낼 수 있고, Swift에서는 Double, Float의 두 가지 부동 소수점 타입을 제공합니다. Double은 64 비트 부동 소수점, Float는 32 비트 부동 소수점입니다. Double의 정밀도는 십진수 15 자리 이상이고 Float의 정밀도는 십진수 6자리입니다. 적절한 부동 소수점 타입은 코드에서 작업해야 하는 값의 특성과 범위에 따라 달라진다고 합니다.

Type Safety and Type Inference

Swift는 Type-safe 언어입니다.. 즉 잘못된 자료형을 사용하면 컴파일러가 화를 내(?)줍니다. 따라서 개발자는 오류를 빨리 발견할 수 있습니다. Type-Checking은 다른 타입을 사용하려고 할 때 오류를 발생시켜서 오류를 피할 수 있습니다. 하지만 미리 자료형을 선언하지 않으면 Swift는 type-inference를 통해 적절한 타입을 찾습니다. type-inference를 통해 컴파일러는 코드를 컴파일할 때 자동으로 자료형을 추론할 수 있습니다. Type-inference 때문에 swift는 C와 Objective-C와는 다르게 자료형 선언이 필수적이지 않습니다. 하지만 상수, 변수 선언을 위한 let, var는 꼭 써줘야 합니다.

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

이렇게 자료형을 정의해 주지 않아도 Swift는 알아서 Int 형일 것이라고 추론합니다.

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

Swift는 부동 소수점을 추론할 때는 항상 Double로 추론합니다.

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

3에는 명시적인 유형이 없고 뒤에 나오는 0.14159에 부동 소수점 숫자가 존재하므로 Double로 추론합니다.

Numeric Literals

정수형 리터럴은 아래와 같이 나타낼 수 있습니다. 10진수는 접두사가 없고, 2진수는 0b, 8진수는 0o, 16진수는 0x의 접두사를 가집니다.

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 접두사가 붙습니다. 부동 소수점에는 e로 표시되는 지수를 가질 수도 있습니다.

1.25e2 = 1.25 x 102, or 125.0.

1.25e-2 = 1.25 x 10-2, or 0.0125.

16진수에서는 e가 아닌 p로 지수를 표현합니다.

0xFp2 means 15 x 22, or 60.0.

0xFp-2 means 15 x 2-2, or 3.75.

// 모두 10진수로 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

Numeric Type Conversion

음수가 아닌 정수에도 상수 및 변수에는 Int를 써야 합니다. 이렇게 해야 어떠한 경우에도 정수형 상수와 변수가 상호적으로 사용될 수 있기 때문입니다. 크기가 지정된 데이터, 성능, 메모리 등의 최적화 등 특별한 경우에만 Int가 아닌 다른 정수형 타입을 사용하는 게 좋습니다. 이렇게 사용하면 미리 사용했다고 문서화를 해두는 것을 추천합니다!

Integer Conversion

정수 상수 또는 변수에 저장될 수 있는 숫자의 범위는 정수 타입마다 다릅니다. 예를 들어 Int8 은 -128에서 127까지의 숫자만 저장 가능하고 UInt8은 0에서 255의 숫자를 저장할 수 있습니다. 만약 이를 초과한 값을 넣게 되면 오류를 발생합니다.

let cannotBeNegative: UInt8 = -1 // UInt8 cannot store negative numbers, and so this will report an error let tooBig: Int8 = Int8.max + 1 // Int8 cannot store a number larger than its maximum value, // and so this will also report an error

이는 각자의 정수 타입마다 저장할 수 있는 값이 다르기 때문입니다. 즉 사용을 위해 다른 정수 타입으로 변환을 해주어야 합니다.

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

위의 코드와 같이 다른 타입의 정수형을 직접 더할 수 없기 때문에 UInt16()을 사용하여 UInt8을 UInt16으로 변환한 뒤 더해주었습니다. 물론 twoThousandAndOne의 타입도 UInt16이 됩니다.

Integer and Floating-Point Conversion

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

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

three는 정수형이고 pointOneFourOneFiveNine은 부동소수점 숫자이므로 같은 타입으로 변환한 뒤 더해줄 수 있습니다.

let integerPi = Int(pi) // integerPi equals 3, and is inferred to be of type Int

만약 위와 같이 부동소수점 숫자를 정수형으로 바꿔주면 소수점 아래 숫자를 모두 버리게 됩니다. 즉 3.14159에서 3만 남게 됩니다.

Type Aliases

타입의 별명이라고 볼 수 있는 Type Aliases는 기존 타입을 다른 이름으로 선언하는 것 입니다.

typealias AudioSample = UInt16

이렇게 하면 UInt16 타입을 AudioSample이라는 이름으로도 접근할 수 있게 됩니다.

Booleans

Swift에는 기본적인 Boolean type으로 Bool을 가지고 있습니다.

이는 오로지 true, false만을 값으로 가질 수 있습니다.

let orangesAreOrange = true let turnipsAreDelicious = false

위의 코드처럼 상수나 변수를 생성하자마자 true, false로 설정하면 Bool로 선언할 필요가 없습니다. Boolean 값은 if와 같은 조건문에서 유용하게 사용될 수 있습니다.

if turnipsAreDelicious { print(“Mmm, tasty turnips!”) } else { print(“Eww, turnips are horrible.”) } // Prints “Eww, turnips are horrible.”

Swift는 Type-safe 언어이기 때문에 Bool 자료형이 와야 하는 곳에 다른 자료형이 오게 되면 당연히 오류를 발생시킵니다. 아래와 같이 기본 연산자로도 Bool 자료형을 선언할 수 있습니다.

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

Tuples

Tuple(튜플)은 여러 개의 값을 하나의 복합 값으로 그룹화하는 것을 말합니다. 튜플 내의 값은 모든 자료형이 가능합니다. 하나의 자료형만 가능한 것이 아니고 여러 개의 자료형이 함께 존재해도 상관없습니다.

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

위의 코드와 같이 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”

튜플은 함수의 반환 값으로 사용하면 유용합니다. 예를 들어 웹페이지 검색의 성공 또는 실패를 설명하기 위해 (Int, String) 튜플 타입을 사용할 수 있습니다.

Optionals

개발자는 Optional(옵셔널)을 비어있는 값을 표현할 때 사용할 수 있습니다. 옵셔널은 두 가지 상태를 표현합니다. 값이 있거나, 없거나가 그 두 가지입니다. 따라서 개발자는 옵셔널을 사용할 땐 옵셔널을 뜯어봐서 값이 있는지 없는지 확인해야 합니다. 예를 한 번 보겠습니다.

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

String 타입의 값을 Int 타입으로 바꿔 줄 수 있는데, 항상 바뀌는 것은 아닙니다. “123”과 같은 String 타입은 Int 타입으로 바꿔줄 수 있지만 “Hello”와 같은 String 타입은 바꿀 수 없습니다. 즉 실패할 수 있는 경우에 Int 대신 Int?를 사용하면 성공하면 Int를 넣고 실패하면 nil을 넣음으로써 오류를 방지할 수 있습니다. 자료형 뒤에?를 붙이면 옵셔널 타입으로 선언하는 것입니다. 하지만 Int?로 선언하면 Int형과 nil만 들어갈 수 있지 String이나 Bool과 같은 다른 타입들은 들어갈 순 없습니다.

nil

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

위와 같이 정수형 옵셔널로 선언된 값에 nil을 넣어주면 더 이상 serverResponseCode에는 값이 존재하지 않게 됩니다.

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

만약 옵셔널 변수를 선언한 뒤 아무것도 넣지 않으면 Swift에서 자동적으로 nil을 넣습니다.

If Statements and Forced Unwrapping

개발자는 옵셔널에 값이 있는지 없는지를 확인하기 위해 뜯어봐야 하는데 이때 if를 사용할 수 있습니다.

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

이렇게 convertedNumber이라는 변수가 nil이 아니면 조건 문의 코드를 실행하게 됩니다. 또한 해당 변수 뒤에!를 붙이게 되면 nil이 아닌 그 변수에 존재하는 값을 추출하여 사용하게 됩니다. 만약 값이 없는데 !를 붙여 꺼내려고 하면 오류가 발생하므로 위와 같이 옵셔널이 nil 인지 아닌지를 확인 후 사용해야 합니다.

Optional Binding

Optional Binding(옵셔널 바인딩)은 옵셔널에 값이 있는지 본 뒤 있다면 해당 값을 가지는 상수나 변수를 만들고 사용할 수 있게 하는 것입니다. 옵셔널 바인딩에는 if, while 문이 사용될 수 있고 사용법은 아래와 같습니다.

if let actualNumber = Int(possibleNumber) { print(“The string \”\(possibleNumber)\” has an integer value of \(actualNumber)”) } else { print(“The string \”\(possibleNumber)\” could not be converted to an integer”) } // Prints “The string “123” has an integer value of 123″

possibleNumber는 옵셔널 변수입니다. if let을 사용하여 만약 possibleNumber에 값이 있다면 actualNumber라는 상수에 값을 넣어 조건문에서만 사용할 수 있게 합니다. 만약 nil이라면 actualNumber는 만들어지지 않습니다. 이때 앞의 글에서 본 것처럼 !를 사용하지 않아도 actualNumber에는 possibleNumber의 값이 존재하게 됩니다. 물론 let 말고 var를 사용하여 변수처럼 사용할 수도 있습니다.

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" 여러 개의 옵셔널 바인딩을 한 번에 사용할 수도 있습니다. Implicitly Unwrapped Optionals 앞에 글에서처럼 옵셔널을 사용하려면 if를 사용하여 값이 존재하는지 확인한 뒤 옵셔널 바인딩으로 값에 접근할 수 있었습니다. 만약 절대로 nil이 아닌 값이 존재하는 값이 존재한다면 어떨까요? 이럴 때는 if let과 같은 구문을 사용하지 않고 바로 접근하면 편할 것 같습니다. 이럴 때 바로 값에 접근할 수 있는 방법이 !를 붙이는 것입니다. 옵셔널 변수 선언 시?를 붙이면 암시적 옵셔널, !를 붙이면 명시적 옵셔널이 됩니다.! 를 붙인 옵셔널은 처음 정의된 후에는 값이 존재한다고 보고 앞으로 모든 시점에서 존재한다고 확신할 수 있을 때 유용합니다. Swift에서는 주로 클래스 초기화할 때 사용됩니다. let possibleString: String? = "An optional string." let forcedString: String = possibleString! // requires an exclamation point let assumedString: String! = "An implicitly unwrapped optional string." let implicitString: String = assumedString // no need for an exclamation point forcedString에서 possibleString에 !를 붙여주는 이유는 possibleString이 ?를 붙여준 암시적 옵셔널 변수이기 때문입니다. 하지만 처음 선언부터 !를 붙여 정의한 assumedString 같은 경우에는 다른 변수에서 사용할 때 !를 붙여주지 않아도 되는 것을 볼 수 있습니다. let optionalString = assumedString // The type of optionalString is "String?" and assumedString isn't force-unwrapped. 만약 암시적으로 선언된 옵셔널이 nil인데 명시적 옵셔널이 접근하려고 하면 런타임 오류가 발생합니다. if assumedString != nil { print(assumedString!) } // Prints "An implicitly unwrapped optional string." 즉 그러한 런타임 오류를 방지하기 위해 위와 같이 사용하면 됩니다. Error Handling 프로그램에서 오류가 발생하면 오류 처리를 사용하여 해결해야 합니다. 오류 처리를 통해 실패 원인을 알아내고 발생한 오류를 다른 부분으로도 전파할 수 있습니다. 만약 함수에서 에러가 발생되면 throws를 사용하여 에러를 던질(?) 수 있습니다. 그런 뒤 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 } 만약 canThrowAnError에서 에러가 발생하면 오류를 던져 catch 구문을 실행합니다. 에러가 발생하지 않으면 그냥 함수를 수행한다. 여기서 do try 구문은 한 번 실행해볼까? 하고 실행을 했는데 실행한 함수가 throws로 오류를 던지면 catch를 받아 처리한다는 느낌으로 이해하면 쉽습니다. func makeASandwich() throws { // ... } do { try makeASandwich() eatASandwich() } catch SandwichError.outOfCleanDishes { washDishes() } catch SandwichError.missingIngredients(let ingredients) { buyGroceries(ingredients) } 조금 더 구체적인 예를 보면 위와 같습니다. makeASandwich 함수를 실행하려고 했는데 만약 오류가 발생하면 catch 구문을 아니면 그냥 makeASandwich 실행 후 eatASandwich 함수를 실행한다는 의미입니다. 여기서 SandwichError.outOfCleanDishes나 SandwichError.missingIngredients(let ingredients)는 위에서는 생략되었지만 개발자가 미리 선언한 에러의 종류입니다. 즉 에러의 종류에 따라 실행할 코드를 달리하는 것이라고 볼 수 있습니다. 이는 나중에 Error Handling 단원에서 자세히 알아보겠습니다. Assertions and Preconditions Assertions and Preconditions은 런타임 시 발생하는 것들을 확인하는 것입니다. 추가 코드를 실행하기 전에 사용해서 조건들이 맞는지 확인할 수 있습니다. 만약 조건들이 false로 나오게 되면 코드 실행이 중단되고 프로그램이 종료됩니다. Assertion은 개발과정에서 실수를 잡고 preconditions는 문제를 감지하는 데 도움을 줍니다. 앞에서 본 Error Handling 과는 다르게 Assertions and Preconditions는 복구 가능하거나 예상되는 오류에는 사용되지 않습니다. 이는 발견 즉시 프로그램을 종료하기 때문입니다. 하지만 바로 종료하기 때문에 잘못된 상태로 인한 피해를 줄일 수 있습니다. 또한 종료가 되어버리기 때문에 오류를 쉽게 디버깅할 수 있습니다. Assertions과 Precondition의 조건들을 확인할 때 차이가 납니다.. Asserions는 디버그 빌드에서만 체크를 하지만 Preconditions는 디버그, 프로덕션 빌드 모두 체크합니다. 프로덕션 빌드에서는 Assertion이 체크되지 않기 때문에 프로덕션 성능에 영향을 주지 않으면서 Assertion을 사용할 수 있습니다. Debugging with Assertions Assertion은 assert(::file:line:) 함수로 사용할 수 있습니다. let age = -3 assert(age >= 0, “A person’s age can’t be less than zero.”) // This assertion fails because -3 is not >= 0.

assert 함수의 조건을 확인하고 true 면 그냥 진행하고 false 면 프로그램을 종료하며 만약 오류 구문을 적어뒀다면 그것이 출력됩니다.

if age > 10 { print(“You can ride the roller-coaster or the ferris wheel.”) } else if age >= 0 { print(“You can ride the ferris wheel.”) } else { assertionFailure(“A person’s age can’t be less than zero.”) }

만약 조건이 이미 체크됐다면 assertionFailure(_:file:line:) 함수를 사용해 실패를 알릴 수 있습니다.

Enforcing Preconditions

precondition은 조건이 거짓이 될 가능성이 있지만 코드가 실행되기 위해선 반드시 참이어야 할 때 사용합니다. precondition(::file:line:) 함수로 사용할 수 있고 만약 조건이 false라면 설정해둔 오류 구문을 출력합니다.

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

preconditionFailure(_:file:line:) 함수를 사용해서 실패가 발생했다는 것을 표시할 수 있습니다. 만약 uncheckedmode(-Ounchecked) 라면 preconditions는 체크되지 않습니다. 이때 컴파일러는 조건들이 모두 참이라고 생각하고 진행합니다. 그러나 fatalError(_:file:line:) 함수는 이와 관계없이 항상 체크되고 프로그램을 중지시킵니다. 개발자는 fatalError(_:file:line:) 함수를 개발 초기에 사용하여 치명적인 오류에 대해 항상 중지되도록 설정할 수 있습니다.

감사합니다.

반응형

키워드에 대한 정보 스위프트 문법

다음은 Bing에서 스위프트 문법 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 1시간에 정리하는 Swift 문법 리뷰, swift 강좌

  • Swift 문법
  • Swift 강좌
  • swift
  • 스위프트
  • swift 인강
  • swift 강의
  • swift 기초

1시간에 #정리하는 #Swift #문법 #리뷰, #swift #강좌


YouTube에서 스위프트 문법 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 1시간에 정리하는 Swift 문법 리뷰, swift 강좌 | 스위프트 문법, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment