<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>orzr.log</title>
        <link>https://velog.io/</link>
        <description>✨</description>
        <lastBuildDate>Fri, 07 Apr 2023 04:05:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>orzr.log</title>
            <url>https://velog.velcdn.com/images/orzr_/profile/5ae7a146-4aeb-4939-8c55-a636b3b43b8b/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. orzr.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/orzr_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[swift] 옵셔널]]></title>
            <link>https://velog.io/@orzr_/swift-%EC%98%B5%EC%85%94%EB%84%90</link>
            <guid>https://velog.io/@orzr_/swift-%EC%98%B5%EC%85%94%EB%84%90</guid>
            <pubDate>Fri, 07 Apr 2023 04:05:12 GMT</pubDate>
            <description><![CDATA[<h2 id="옵셔널">옵셔널</h2>
<p>옵셔널은 값이 있을 수도, 없을 수도 있는 표현이다. 즉, 값이 nil일 수도 있다는 것을 의미한다.</p>
<pre><code>public enum Optiona&lt;Wrapped&gt; : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    public init(_ some: Wrapped)
    // 중략...
}</code></pre><p>옵셔널은 이처럼 enum으로 구현되어 있다. nil일 때는 none 케이스가 되고 값이 있는 경우는 some 케이스가 된다. 이 때 연관값으로 Wrapped가 있는데, 값이 있는 경우 Wrapped에 값이 할당된다는 의미이다. 즉, 값이 옵셔널이라는 열거형에 보호되어 래핑되어 있는 모습이다.</p>
<h2 id="옵셔널-추출">옵셔널 추출</h2>
<p>swift는 타입에 엄격한 언어이다. 때문에 Int 타입과 Int? 타입은 완전히 다른 타입으로 인식한다. 옵셔널로 래핑된 데이터를 사용하기 위해서는 언래핑 과정이 필요하다.</p>
<blockquote>
<ol>
<li>옵셔널 바인딩</li>
<li>옵셔널 체이닝</li>
<li>nil 병합 연산자</li>
<li>암시적 추출</li>
<li>강제 추출</li>
</ol>
</blockquote>
<h3 id="옵셔널-바인딩">옵셔널 바인딩</h3>
<p>swift 문법에서 지향하는 옵셔널 추출 방식이다. 옵셔널에 값이 있는지 확인하여 값이 있다면 옵셔널에서 값을 추출한다. 추출된 값은 옵셔널이 아닌 형태로 상수나 변수로 할당되며 일정 블록 안에서 사용할 수 있다.</p>
<pre><code>if let 상수명 = 옵셔널 상수(혹은 변수) {
    실행 구문
}</code></pre><p>let을 사용한 상수가 아닌 var을 사용하여 변수로 할당할 수도 있다. 또한, 쉼표를 이용하여 한번에 여러 옵셔널 값을 바인딩 할 수 있으며 이때 하나라도 값이 nil일 경우 실행 구문은 실행되지 않는다.</p>
<pre><code>guard let 상수명 = 옵셔널 상수 else { 제어문 전환 명령어 }</code></pre><p>guard 구문은 return, continue, break, throw 등의 제어문 전환 명령어를 사용할 수 있는 함수나 메서드, 반복문 등의 특정 블록 내에서만 사용할 수 있다. 때문에 위와 같은 표현은 옵셔널 값이 있는 경우 값을 추출하여 함수내에서 사용하겠다는 의미고, 만약 값이 없다면 더이상 해당 함수를 실행하지 않고 끝내겠다는 의미이다.</p>
<h3 id="옵셔널-체이닝">옵셔널 체이닝</h3>
<p>체이닝이라는 말 그대로 옵셔널이 자전거 체인처럼 서로 꼬리를 물고 있는 형태로, 보통 중첩된 형태를 표현할 때 사용된다.</p>
<pre><code>Class Room {
    var number: Int

    init(number: Int) {
        self.number = number
    }
}

Class Building {
    var name: String
    var roomt: Room?

    init(name: String) {
        self.name = name
    }
}

struct Address {
    var province: String
    var city: String
    var street: String
    var building: Building?
    var detailAddress: String?
}

Class Person {
    var name: String
    var address: Address?

    init(name: String) {
        self.name = name
    }
}</code></pre><p>위와 같이 설계가 된 상황이다.</p>
<pre><code>let orzr: Person = Pserson(name: &quot;orzr&quot;)

let orzrRoom: Int? = orzr.address?.building?.room?.number    //    nil</code></pre><p>orzr의 방 번호에 접근하기 위해 ?를 사용하여 꼬리에 꼬리를 물어 옵셔널 값을 추출했다. .address?.building?.room?.number 중 하나라도 nil 값이 반환되면 결과값으로 nil을 반환하게 된다.</p>
<h3 id="nil-병합-연산자">nil 병합 연산자</h3>
<p><strong>A ?? B</strong> 로 표현하며 A가 nil이 아니라면 A를 반환하고 A가 nil이라면 B를 반환한다.</p>
<pre><code>let value: Int = someValue ?? 0</code></pre><h3 id="암시적-추출">암시적 추출</h3>
<p>nil값을 사용해야하지만 매번 바인딩을 통해 추출하는게 귀찮을 때, nil을 할당해줄 수 있으면서 옵셔널이 아닌 상수나 변수를 사용하면 좋을 것이다. 이때 타입 뒤에 !를 붙여 암시적 추출 방법을 사용하면 된다.</p>
<p>iOS 개발을 하다보면 아래와 같은 표현을 자주 접하게 된다.</p>
<pre><code>@IBOutlet weak var nameLabel: UILabel!</code></pre><p>암시적 추출로 지정된 타입은 일반 값처럼 사용할 수 있으며 여전히 옵셔널이기 때문에 nil값도 할당해줄 수 있다.</p>
<p>프로퍼티에 유효한 값이 들어가야 클래스나 구조체가 초기화 되는데, 뷰 컨트롤러가 인스턴스화될 때 뷰는 아직 로드되지 않은 상태이다. 그래서 초기화가 되는 동안 프로퍼티에 nil이 들어가기 위해 암시적 추출 옵셔널을 사용한다. nameLabel은 nil상태지만 런타임시 스토리보드와 연결 된다.</p>
<h3 id="강제-추출">강제 추출</h3>
<p>옵셔널 값을 추출하는 가장 단순하지만 가장 위험한 방법으로, 옵셔널을 사용하는 의미가 무색해지는 방법이다.</p>
<pre><code>var name: String? = &quot;orzr&quot;

var my: String = name!

name = nil

my = name!    // 런타임 오류</code></pre><p>강제 추출을 하는 방법은 옵셔널 변수(혹은 상수) 뒤에 !를 붙이면 된다. 하지만 값이 nil일 때 강제 추출을 진행하게 되면 런타임 오류가 발생하니 강제 추출 방식은 지양하자!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] 함수]]></title>
            <link>https://velog.io/@orzr_/%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@orzr_/%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 06 Apr 2023 08:07:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>swift에서 함수는 일급 객체이다. 또한 생략 및 추가가 가능한 부분이 존재하기 때문에 다양한 형태로 구현될 수 있다. 혼란을 방지하기 위해 협업자끼리 코딩 규칙을 만드는 것을 추천한다!</p>
</blockquote>
<p>override와 overroad를 모두 지원한다. 그렇기 때문에 매개변수의 타입이 다르면 같은 이름의 함수를 여러 개 만들 수 있고, 매개변수의 갯수가 달라도 같은 이름의 함수를 만들 수 있다.
아래는 함수의 기본 형태이다.</p>
<pre><code>func 함수이름(매개변수..) -&gt; 반환타입 {
    실행 구문
    return 반환값
}</code></pre><p>매개변수가 필요없다면 소괄호 안을 비워줄 수 있다. 반환 타입이 없다면 -&gt;를 포함한 반환타입도 생략이 가능하다. 또한 return값이 없거나 함수 내부의 코드가 한 줄이고, 그 표현의 결괏값이 함수의 반환 타입과 일치한다면 return 키워드도 생략이 가능하다.
매개변수 이름 앞에 전달인자 레이블을 설정해줄 수 있다. 또, 매개변수의 기본값도 설정이 가능하다!</p>
<p>swift에서 함수는 일급 객체이기 때문에 함수의 매개변수로 함수를 사용하는 것이 가능하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] 반복문]]></title>
            <link>https://velog.io/@orzr_/%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@orzr_/%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Thu, 06 Apr 2023 07:39:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>특정 명령어를 반복해서 실행해야 하는 경우 반복문을 사용합니다. 특히 배열과 같은 순서가 있는 데이터는 반복문을 사용해여 편리하게 처리할 수 있다. 또한 continue, break 등의 제어 키워드 사용이 가능하다.</p>
</blockquote>
<h2 id="for---in">for - in</h2>
<pre><code>for 임시 상수 in 시퀀스 아이템 {
    실행 코드
}</code></pre><h2 id="while">while</h2>
<p>while문의 조건문은 Bool 타입으로 지정되어야 한다. </p>
<pre><code>while 조건문(Bool 타입) {
    실행 코드
}</code></pre><h2 id="repeat---while">repeat - while</h2>
<p>다른 프로그래밍 언어의 do - while 구문과 크게 다르지 않다. repeat 블록의 코드를 최초 1회 실행한 후, while 다음의 조건이 성립하면 블록 내부의 코드를 반복 실행한다.</p>
<pre><code>repeat {
    실행 코드
} while 조건문</code></pre><p>+ 중첩된 반복문을 사용할 때 반복문의 앞에 이름과 함께 콜론을 붙여 구문의 이름을 지정해주면 제어 키워드를 사용하여 원하는 반복문을 종료시킬 수 있다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] 조건문]]></title>
            <link>https://velog.io/@orzr_/%EC%A1%B0%EA%B1%B4%EB%AC%B8</link>
            <guid>https://velog.io/@orzr_/%EC%A1%B0%EA%B1%B4%EB%AC%B8</guid>
            <pubDate>Thu, 06 Apr 2023 07:27:21 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>특정 조건에서 코드를 실행해야 하거나 실행하지 않아야 하는 경우 사용되는 것이 조건문이다. swift에서 조건문의 값은 꼭 Bool 타입이어야 한다. 또한 소괄호는 대부분 생략이 가능하다!</p>
</blockquote>
<h2 id="if">if</h2>
<p>대표적인 조건문으로 if else 등의 키워드를 사용할 수 있다. else if는 갯수 제한 없이 여러개가 이어져도 상관 없으며, else 블럭은 없어도 괜찮다!
if를 사용하여 옵셔널 바인딩도 가능하다. 자세한 내용은 옵셔널 부분에서 다루도록 하겠다.</p>
<h2 id="switch">switch</h2>
<p>swift에서 break는 생략이 가능하다. 다른 언어에서 break 키워드를 빼서 의도적으로 여러 케이스를 연속으로 실행하도록 하는 기능을 사용하고싶을 경우 <strong>fallthrough</strong> 키워드를 사용한다. 비교될 값이 명확히 한정적인 값이 아니라면 <strong>default</strong>를 꼭 작성해줘야한다. 각 case에는 범위 연산자를 사용할 수도, where절을 사용하여 조건을 확장할 수도 있다.
swift의 switch문에서는 tuple matching을 지원한다. 또한 열거형을 입력으로 받을 경우 열거형의 모든 case를 정의해줘야한다. 만약 열거형에 case가 추가될 가능성이 있다면 switch문의 맨 마지막에 @unknwon 속성을 부여해주면 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] Tuple]]></title>
            <link>https://velog.io/@orzr_/swift-Tuple</link>
            <guid>https://velog.io/@orzr_/swift-Tuple</guid>
            <pubDate>Thu, 06 Apr 2023 06:50:48 GMT</pubDate>
            <description><![CDATA[<h2 id="tuple">Tuple</h2>
<blockquote>
<p>튜플은 데이터를 나열하므로써 생성이 가능하다. 같은 타입일 필요는 없으며 개수 또한 자유롭게 정할 수 있다. 타입 이름이 따로 지정되어 있지 않아 프로그래머가 원하는대로 타입을 생성할 수 있다. </p>
</blockquote>
<p>+ tuple도 데이터 타입의 한 종류이기 때문에 한 번 선언하면 이후에 수정이 불가능하다.</p>
<h3 id="접근-방법">접근 방법</h3>
<pre><code>var person: (String, Int, Double) = (&quot;orzr&quot;, 25, 162.5)</code></pre><p>&#39;orzr&#39;에 접근하기 위해서는 person.0 과 같이 인덱스를 사용하여 데이터를 사용할 수 있다.
하지만 각각의 데이터가 무엇을 의미하는지 유추하기 어렵기 때문에 다음 예시와 같이 사용하는 것이 더 바람직하다.</p>
<h3 id="named-tuple"><strong>Named tuple</strong></h3>
<pre><code>var person: (name: String, age: Int, height: Double) = (&quot;orzr&quot;, 
25, 162.5)</code></pre><p>이처럼 멤버 앞에 이름을 붙여줌으로써 데이터가 의미하는 것이 무엇인지 정확이 인지할 수 있다. 또한 person.name과 같이 인덱스가 아닌 멤버의 이름을 통해 데이터에 접근할 수 있다. 하지만 같은 모양의 튜플을 여러번 사용하려면 약간의 불편함이 생길 수 있다. 이럴 때 <strong>타입 별칭</strong>을 사용하여 더욱 깔끔하고 안전하게 코드를 작성할 수 있다.</p>
<pre><code>// 이미 존재하는 데이터 타입에 임의로 별칭 부여
typealias PersonTuple: (name: String, age: Int, height: Double)

let orzr: PersonTuple = (&quot;orzr&quot;, 25, 162.5)
let dorothy: PersonTuple = (&quot;도로시, 11, 137)</code></pre><p>위 예시처럼 <strong>typealias</strong>를 사용하면 동일한 모양의 튜플을 사용하기에 용이하다!</p>
<h3 id="decomposition">Decomposition</h3>
<p>튜플을 사용하다보면 상수나 변수에 튜플 값을 할당해주어야 하는 경우가 생길 수 있다.</p>
<pre><code>let university: (String, Int, Bool) = (&quot;한국대&quot;, 2, false)

let major = university.0
let grade = university.1
let isPlural = university.2</code></pre><p>이런 식으로 값을 할당할 수 있지만 꽤나 귀찮은 방법이다. 이럴 때 decomposition 문법을 사용하면 더욱 깔끔하게 값을 할당해 줄 수 있다.</p>
<pre><code>let (major, grade, isPlural) = university

let (major, grade, _) = university</code></pre><p>상수나 변수의 갯수와 튜플의 멤버 수는 같아야한다! 만약 사용하지 않는 상수나 변수가 있을 경우 wildcard(_)를 사용해주면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] 컬렉션 타입]]></title>
            <link>https://velog.io/@orzr_/swift-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@orzr_/swift-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%83%80%EC%9E%85</guid>
            <pubDate>Wed, 05 Apr 2023 05:01:29 GMT</pubDate>
            <description><![CDATA[<h3 id="컬렉션-타입">컬렉션 타입</h3>
<p><strong>많은 수의 데이터를 묶어서 저장하고 관리할 수 있는 데이터 타입</strong></p>
<blockquote>
<p>Array : 중복없이 데이터를 순서대로 나열한 컬렉션
Dictionary : 순서없이 데이터를 키와 값의 쌍으로 관리하는 컬렉션
Set : 순서없이 데이터를 중복을 허용하여 관리하는 컬렉션</p>
</blockquote>
<h3 id="array">Array</h3>
<p>동일한 타입의 데이터를 일렬로 나열하여 저장하는 형태의 컬렉션 타입으로 <strong>순서가 존재</strong>한다. 같은 값이 존재할 수 있으며 요소의 삽입 및 삭제가 자유롭다.</p>
<pre><code>// 빈 Array 생성!
var emptyArray: [Any] = [Any]()
var emptyArray: [Any] = Array&lt;Any&gt;()
var emptyArray: [Any] = []    // 배열 타입을 정확하게 명시해줬다면 []만 사용해도 됨

// Array 선언 방식 1
var characters: Array&lt;String&gt; = [&quot;orzr&quot;, &quot;dorothy&quot;, &quot;toto&quot;]

// Array 선언 방식 2
var age: [Int] = [25, 14, 5]

// 특정 요소의 인덱스 찾기
print(characters.index(of: &quot;orzr&quot;)    // 0

// 특정 위치에 요소 추가
characters.insert(&quot;happy&quot;, at: 1)    // orzr happy dorothy toto

// 마지막 위치에 요소 추가
age.append(11)                        // 25 14 5 11

// contentOf를 사용하여 여러개의 요소 삽입 가능!
characters.append(contentOf: [&quot;sweet&quot;, &quot;potato&quot;])    // orzr happy dorothy toto sweet potato

// 요소 삭제 -&gt; 삭제된 요소 반환됨
characters.removeLast()        // orzr happy dorothy toto sweet
characters.removeFirst()    // happy dorothy toto sweet
characters.remove(at: 0)    // dorothy toto sweet

// 특정 구간 확인 및 변경
print(age[1 ... 2])        // 14 5
age[1 ... 2] = [15, 7]    //age = [ 25, 15, 7, 11]</code></pre><p>Array의 경우 인덱스를 벗어날 경우 오류가 발생한다!</p>
<h3 id="dictionary">Dictionary</h3>
<p>Dictionary는 <strong>순서없이</strong> 키와 값의 쌍으로 구성된 컬렉션 타입이다. 키 값은 Dictionary내에 중복해서 사용할 수 없는 식별자 역할을 한다.</p>
<pre><code>// 빈 Dictionary 생성!
var emptyDictionary: Dictionary&lt;String, Int&gt; = Dictionary&lt;String, Int&gt;()
var emptyDictionary: [String: Int] = [String: Int]()
var emptyDictionary: [String: Int] = [:]    //키와 값 타입을 정확히 명시해줬다면 [:]만 사용해도 됨

// Dictionary 선언 방식
var numberForName: [&quot;orzr&quot;: 25, &quot;dorothy&quot;: 100, &quot;toto&quot;: 66] 

// 키 값으로 값 접근
numberForName[&quot;orzr&quot;] = 100
print(numberForName[&quot;orzr&quot;])    // 100
print(numberForName[&quot;happy&quot;])    // nil

// 요소 추가
numberForName[&quot;happy&quot;] = 99

// 요소 삭제 -&gt; 삭제된 값이 반환됨 (키X 값만!)
print(numberForName.removeValue(forKey: &quot;dorothy&quot;))    // 100
</code></pre><p>Dictionary의 경우 Array와는 다르게 내부에 존재하지 않는 키로 접근해도 오류가 발생하지 않고 nil을 반환한다.</p>
<h3 id="set">Set</h3>
<p>같은 타입의 데이터를 순서 없이 저장하는 형태의 컬렉션 타입으로 중복된 값이 존재하지 않는다. 꼭 해시 가능한(hashable) 값을 가져야하며 기본 데이터 타입은 모두 hashable이다.</p>
<blockquote>
<p>&#39;해시 가능한&#39;이라는 것은 swift 표준 라이브러리의 Hashable 프로코콜을 따른다는 것을 의미한다</p>
</blockquote>
<p>Set은 Array와 마찬가지로 대괄호를 사용하기 때문에 타입 추론을 하게되면 Array로 타입을 지정하게 된다. <del>축약형은 없음</del></p>
<pre><code>// 빈 Set 생성!
var characters: Set&lt;String&gt; = Set&lt;String&gt;()
var characters: Set&lt;String&gt; = []

// Set 선언 방식
var chracters: Set&lt;String&gt; = [&quot;orzr&quot;, &quot;dorothy&quot;, &quot;toto&quot;]

// 요소 추가
characters.insert(&quot;happy&quot;)

// 요소 삭제 -&gt; 삭제된 요소 반환
characters.remove(&quot;dorothy&quot;)
</code></pre><p>타입 추론에 의존하게 되면 에러가 발생했을 경우 원인을 찾는것이 더욱 어려워질 수 있기 때문에 타입 추론은 지양하자!</p>
<p>Set은 집합 관계를 표현하고자 할 때 매우 유용하게 사용된다. </p>
<pre><code>let intersect: Set&lt;String&gt; = A.intersection(B)        // A와 B의 교집합
let symmetric: Set&lt;String&gt; =A.symmetricDifference    // A와 B의 여집합
let union: Set&lt;String&gt; =A.union(B)                    // A와 B의 합집합
let subtract: Set&lt;String&gt; =A.subtracting(B)            // A와 B의 차집합

// Bool 값을 반환
A.isDisjoint(with: B)    // 서로 배타적인지
A.isSubset(of: B)        // A가 B의 부분집합인지
A.isSuperset(of: B)     // A가 B의 전체집합인지</code></pre><hr>
<p>출처 : 스위프트 프로그래밍 3판 (야곰)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[swift] 데이터 타입(자료형)]]></title>
            <link>https://velog.io/@orzr_/swift-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@orzr_/swift-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Wed, 05 Apr 2023 05:00:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>swift의 기본 데이터 타입은 <strong>구조체</strong>를 기반으로 구현되어 있다. swift의 모든 데이터 타입 이름은 첫 글자가 대문자로 시작하는 <strong>대문자 카멜케이스</strong>를 사용한다. </p>
</blockquote>
<h3 id="int와-uint">Int와 UInt</h3>
<p>정수 타입으로 Int는 +, - 부호를 포함한 정수를 의미하고, UInt는 0을 포함한 양의 정수를 의미한다. 시스템 아키텍쳐에 따라 타입이 달라지며 각각 8bit, 16bit, 32bit, 64bit의 형태가 있다.</p>
<blockquote>
<p>swift는 데이터 타입에 있어 매우 엄격하기 때문에 Int와 UInt는 같은 정수 타입일지라도 아예 다른 타입으로 인식한다. 그렇기 때문에 양의 정수만을 사용하더라도 Int 값의 범위에 포함된다면 UInt가 아닌 Int를 사용하는 것이 값을 교환하는 데 있어 더 효율적일 수 있다.</p>
</blockquote>
<hr>
<h3 id="bool">Bool</h3>
<p>boolean 타입으로 true 혹은 false 값을 가진다.</p>
<pre><code>let boolean: Bool = true
boolean.toggle()    //true - false 반전</code></pre><hr>
<h3 id="float과-double">Float과 Double</h3>
<p>부동소수점을 사용하는 실수 타입이다. 정수보다 훨씬 넓은 범위의 수를 표현할 수 있다. Float는 32bit, Double은 64bit의 부동 소수를 표현한다.</p>
<blockquote>
<p>Float과 Double 타입에 정수값을 넣어도 문제되지 않지만, Double값에 Float값을 넣게 되면 에러가 발생한다.</p>
</blockquote>
<hr>
<h3 id="character와-string">Character와 String</h3>
<p>문자형 타입으로 앞뒤에 큰따옴표를 붙여 표현한다. Character은 문장이 아닌 단 하나의 문자를 의미하며 String은 문자의 집합, 즉 문자열을 의미한다. 유니코드9 문자를 사용하여 영어는 물론, 한글 및 이모티콘도 사용이 가능하다. </p>
<p><strong>문자열 다루기!</strong></p>
<pre><code>// 이니셜라이저를 사용하여 빈 문자열 생성
var message: String = String()     
let hello: Striing = &quot;hello&quot;
let world: String = &quot;world&quot;

// .append()와 + 기호를 사용하여 문자열을 이어 붙일 수 있음
message.append(hello)            // hello 
message = message + &quot; &quot; + world    // hello world

// .isEmpty()를 사용하여 문자열이 비어있는지 확인 가능
print(message.isEmpty)    //false

// 대소문자 변환
print(message.uppercased())    // HELLO WORLD
print(message.lowercased())    // hello world

// 문자열이 특정 문자(혹은 문자열)로 시작하는지 확인
var hasPrefix: Bool = false
hasPrefix = message.hasPrefix(&quot;hell&quot;)    // true
hasPrefix = message.hasPrefix(&quot;wo&quot;)        // false

// 문자열이 특정 문자(혹은 문자열)로 끝나는지 확인
var hasSuffix: Bool = false
hasSuffix = message.hasSuffix(&quot;he&quot;)        // false
hasSuffix = message.hasSuffix(&quot;rld&quot;)    // true

// 문자열에 특정 문자(혹은 문자열)이 포함되어 있는지 확인
var contains: Bool = false
contains = message.contains(&quot;hello&quot;)    // true
contains = message.contains(&quot;WORLD&quot;)    // false</code></pre><hr>
<h3 id="any와-anyobject-nil">Any와 AnyObject, nil</h3>
<p>이들의 공통점은 데이터 타입의 위치에서 특정한 역할을 수행한다는 점이다.
먼저 Any는 swift의 모든 데이터 타입을 사용할 수 있다. 변수 또는 상수의 데이터 타입이 Any로 지정되어 있다면 nil을 제외한 어떤 종류의 데이터 타입도 할당할 수 있다.
다음으로 AnyObject는 클래스의 인스턴스만 할당할 수 있다. Any와 마찬가지로 nil값은 할당할 수 없다.</p>
<blockquote>
<p>타입이 엄격한 swift의 특성상 Any 혹은 AnyObject로 선언된 변수의 값을 사용하려면 매번 타입을 확인한 후 변환을 해주는 불편함이 있기 때문에 되도록 사용하지 않는 것이 좋다!</p>
</blockquote>
<p>nil은 &#39;없음&#39;을 나타내는 키워드로, 변수 또는 상수에 값이 들어있지 않고 비어있음을 나타낸다.
<del>자세한 내용은 추후에 정리하도록 하겠슴니다</del></p>
<hr>
<p>출처 : 스위프트 프로그래밍 3판 (야곰)</p>
]]></description>
        </item>
    </channel>
</rss>