# 기초문법

  1. 변수 선언은 var 키워드로 한다.
  2. 코드작성 후 세미콜론은 붙이지 않아도 된다.
  3. 문자열 보간법 - 자바스크립트의 백틱으로 문자열 내에 변수값을 집어넣는 방법은 백슬래시를 사용한다.
  4. 일반적으로 스위프트에서 문자열은 쌍따옴표로 감싼다.
  5. 스위프트에서 변수명은 camel case로 작성하는것이 일반적이다.
  6. 상수 선언 키워드는 let으로 사용한다.
  7. 주석처리는 //슬래시 두개를 붙여 사용한다. 여러 줄을 주석처리 할 경우 /* */를 사용한다.
  8. 반드시 변수 선언과 동시에 초기화를 진행할 필요는 없다.
var name = "박경준";

print("제 이름은 \(name) 입니다.");

var value:Int;
value = 10;

# 데이터 타입

  1. Int - 정수형
  2. Float - 소수점 포함 6자리 (4바이트)
  3. Double - 소수점 포함 15자리 (8바이트)
  4. Character - 문자 한개
  5. String - 문자열
  6. Bool - 참/거짓값
// 타입 확인하기
let value = "A";
print(type(of: value)); // Character

타입 키워드

타입과 관련된 키워드는 첫 글자가 대문자로 시작한다.

타입 확인하기

스위프트 플레이그라운드에서 변수 선언 및 값 할당을 변수 지정없이 진행했을때 타입을 확인하는 방법은 option키보드 버튼을 누른채로 변수를 마우스로 클릭하면 된다.

스위프트 자체에서 타입추론을 통해 타입을 알아낸다.

스위프트는 명시적 타입 선언 이외에 타입추론을 지원한다. var value = 1;로 선언된 변수는 Int형 변수로 자동으로 추론된다.

타입 기반의 언어이기때문에 타입 안정성을 가지고 코드를 작성할 수 있다.

스위프트에는 타입 형변환도 지원된다.

let value = "123";
print(Int(value)); // Optional(123)

타입 변환의 실패

문자열을 정수형으로 타입변환을 하려는 등의 시도를 하면 nil값이(값이 없음을 나타냄) 반환된다.

타입 앨리어스 (별칭붙이기)

typealias 키워드를 통해 타입에 별칭을 붙일 수 있다.

typealias Number = Int;
let value:Number = 1;
print(type(of: value)); // Int
// 별칭 등록을 하더라도 타입은 원 타입으로 인식

# 연산자

이항연산자 및 삼항연산자는 연산자와 피연산자 사이에 공백을 반드시 둬야한다. let x = true?3:2;는 자바스크립트라면 나지 않을 에러가 스위프트에서는 공백이 없어서 에러가 발생한다.

  1. 대입(할당)연산자 : =
  2. 산술연산자
    1. 더하기 : +
    2. 빼기 : -
    3. 곱하기 : *
    4. 나누기 : / - 정수끼리 나누는 경우에는 몫 연산이다. Double(4/5) != Double(4) / Double(5)
    5. 나머지 연산 : % - 정수끼리 나머지 연산
  3. 복합 할당 연산자 당연히 지원 (+= 등)
  4. 비교 연산자 - 다른 언어들과 동일
  5. 논리 연산자 - !, &&, ||
  6. 접근연산자 - .

증감연산자

스위프트는 증감연산자 a++, ++a, --a, a--를 지원하지 않는다.

# 조건문, switch문

let value = 5;
if value == 5{
    print("value == 5");
}
// value == 5

줄맞춤 단축키

선택한 줄에서 컨트롤 + i를 누르면 자동으로 줄맞춤이 이루어진다.

let choice = 2;
switch(choice){
case 1:
    print(1);
case 2:
    print(2);
default:
    print("default")
}

다른 언어와 형식은 동일하다.

타입 기반의 언어이기 때문에 switch에 전달되는 변수 타입과 case의 타입이 동일해야한다.

위쪽 케이스 통과 이후에는 break 없이도 아래쪽 나머지 케이스 코드들을 실행하지 않는다. 다만 아무 동작도 취하지 않고싶은 경우 반드시 break를 실행해야 한다.

let choice = 3;
switch(choice){
case 1:
    print(1);
// 2,3처럼 switch 조건에 콤마로 여러 조건을 넣을 수 있음
case 2, 3:
    print(2);
default:
    print("default")
}

스위프트 스위치문은 콤마로 구분하여 여러 케이스를 같은 조건으로 넣을 수 있다. || 연산과 동일하게 여러 조건 중 하나만 해당해도 문장이 실행됨.

스위치문 범위 조건

스위치문에서는 부등식을 케이스로 넣을 수 없기 때문에 포함 연산자를 사용해야 하고 위에 언급한 콤마처럼 여러 케이스를 나열하는 형식으로 조건을 작성해야한다.

스위프트 문법 중 1...3라는 연산자가 존재하는데 이는 1,2,3 정수를 범위로 갖는 연산자이다. (파이썬의 range와 유사)

let choice = 3;
switch(choice){
case 1:
    print(1);
case 2...4:
    print("2...4");
default:
    print("default")
}

또는 스위치문에 전달되는 변수가 범위 내에 포함되는지도 ~= 연산자를 통해 판단할 수 있다.

범위연산자는 0..5, 0...5, ..<5 등의 형태가 있다.

  1. 0..5 : 0,1,2,3,4
  2. 0...5 : 0,1,2,3,4,5,
  3. ..<5 : 음수값....... 0,1,2,3,4

세 번째 예시의 경우 정수 형태로 표현할 수 있는 가장 작은 값부터 우측항에 전달된 값 -1 까지의 범위를 나타낸다.

범위연산자의 가운데 점 두개냐 세개냐에 따라서는 우측 숫자보다 작은지, 작거나 같은지의 여부가 달라진다.

fallthrough 키워드

switch문 내에서 사용되는 fallthrough키워드를 사용하면 케이스 통과 이후에도 아래 조건들을 검사하게 된다.

# 스위치문 바인딩

스위치문 조건에는 변수 선언과 동시에 case로 전달된 변수값을 바인딩하여 다양한 형태로 분기시킬 수 있다.

바인딩은 선언된 변수에 다른 변수/상수 식별자를 할당하는 것을 의미한다.

스위치문에서의 바인딩은 where 키워드와 함께 사용될때 유용하게 사용될 수 있다.

let val = 3;

switch(val){
case let a where a%2 == 1:
    print(a);
default:
    print("default");
}

case let a where a%2 == 1let a = val이 생략된 것이고 where키워드를 통해 바인딩된 값을 조건과 비교하게 된다.

기본적인 스위치문에서 부등식을 사용하지 못했던 점을 고려하면 where과 함께 사용되는 바인딩 방식이 유용하게 사용될것이다.

let으로 상수 키워드가 아닌 var 변수 키워드로 바인딩을 시키면 switch문 내에서 바인딩한 변수의 값 변경이 가능하다.

# 튜플

여러 데이터타입이 한 공간에 섞인 데이터타입이다.

let myTuple = ("박경준", 25);

print("Name: \(myTuple.0)"); // Name: 박경준
print("Age: \(myTuple.1)"); // Age: 25

튜플에 대한 타입 추론은 튜플 각 요소에 대해 자동으로 이루어진다.

let myTuple = ("박경준", 25);
print(type(of: myTuple)); // (String, Int)

var 키워드로 선언된 튜플 내부 요소값은 접근연산자를 통해 바꿀 수 있다.

var myTuple = ("홍길동", 20);
myTuple.0 = "박경준";
print(myTuple); // (박경준, 20)

튜플 선언 이후에는 타입 구성을 바꿀 수 없다. 가령 (String, Int)형으로 선언된 튜플내부의 타입을 바꾸거나 요소 자체를 지운 채로 새 튜플을 할당할 수 없다는 것이다.

스위프트에서는 자바스크립트 객체 형태처럼 네임드 튜플을 지원한다.

let myTuple = (name: "김경준", age: 25);
print("Name: \(myTuple.name)");
print("Age: \(myTuple.age)");

스위프트 튜플은 자바스크립트 구조분해 문법과 유사하게 튜플 분해 (Decomposition)를 지원한다.

let (name, age) = ("박경준", 25);
print(name);
print(age);

튜플에 타입 앨리어스를 적용하는 것도 유용하다. typealias 좌표 = (Int ,Int)

튜플을 if문 접근연산자를 통해 모두 쪼개어 표현하는 방법도 있지만 switch문을 통해 간편하게 작성할 수도 있다.


let myTuple = ("김경준", 25);

switch(myTuple){
case ("최경준", 24):
    print("최경준");
case ("김경준", 24): // 튜플 요소 하나만 걸린다고 해서 통과되지 않음
    print("?");
case ("김경준", 25):
    print("!");
default:
    break;
}
// !

switch문에서 튜플 각 요소를 변수 / 상수에 할당하는 방법도 존재한다.

let myTuple = ("김경준", 25);

switch(myTuple){
case (let name, let age):
    print("이름은 \(name), 나이는 \(age)!");
default:
    break;
}

바인딩된 튜플 변수/상수와 where도 당연히 엮어서 사용 가능

튜플은 자바스크립트 객체와 유사한 형태이므로 함수값 반환 시 여러 요소를 한번에 반환할때에 자주 사용한다. 추후 네임드 튜플이 활용되는지 확인 필요!

# 범위 연산자

범위 연산자 ...은 오름차순으로만 사용 가능하다. 정수가 묶인 Array타입이 아닌 범위연산자의 반환값은 자체 타입을 갖는다.

  1. 1...10 : ClosedRange
  2. 1... : PartialRangeFrom
  3. ...10: PartialRangeThrough
  4. 1..<10 : Range
  5. ..<10 : PartialRangeUpTo

타입명은 참조만!

범위 연산자는 패턴매칭 연산자 ~=와 사용된다. print(1...10 ~= 5)

comma vs &&

스위프트 조건문에서 조건으로 콤마와 && 연산자를 사용할 수 있는데 둘 간의 차이가 무엇일까?

콤마는 단순히 조건문의 표현식을 여러개 병렬 형태로 붙인것이고 &&는 두 표현식이 하나로 묶이도록 하는 함수라고 보면 된다.

if let a = someOpt, let b = someOtherOpt {} // works

if let a = someOpt && let b = someOtherOpt {} // error

# Reference

  1. 인프런 - 앨런 swift 문법 마스터 스쿨 (opens new window)
  2. 스위프트의 콤마와 &&의 차이: condition과 expression의 구분 (opens new window)