본문 바로가기

iOS 프로그래밍/문법

[swift] 문법 정리1

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
//dictionary는 key:value형식의 배열 
for (animalName, legCount) in numberOfLegs {
	print("\(animalName)s have \(legCount) legs") 
} 
//숫자를 저장

var mynumber : Int = 10

위와 같이 초깃값이 있을 경우에는 컴파일러가 타입 추론을 하므로 데이터 타입을 명시할 필요 없음

 

스위프트 변수 : var

- 변경 가능

스위프트 상수 : let

-변경 불가능(코드 내에서 반복적으로 사용되는 값이 있을 경우에 유용)

-> 애플은 코드의 효율성과 실행 성능을 높이기 위해서 변수보다는 상수를 사용하라고 권장

타입 어노테이션과 타입 추론

타입 어노테이션: 선언 시점에 타입을 선언

타입 추론: 값을 가지고 추론

 

튜플(Tuple)

- 여러 값을 하나의 개체에 일시적으로 묶는 매우 간단한 방법

ex)

▶let myTuple = (10, 432.433, "This is a String")

▶var myString = myTuple.2

▶print(myString) //출력되는 값은? -> This is a String

- 값들이 모두 동일한 타입이어야 한다는 제약이 없음

- 인덱스 위치를 참조하여 간단하게 접근

- 단 한 줄의 코드로 튜플의 모든 값을 추출하여 변수 또는 상수에 할당

let myTuple = (10, 432.433, "This is a String")

let (myInt, myFloat, myString) = myTuple

- 튜플의 값을 선택적으로 추출하는 데 사용될 수 있으며, 무시하고 싶은 값에 밑줄을 사용하면 그 값은 무시

▶var (myInt, _, myString) = myTuple //부동 소수점 수는 무시

- 튜플을 생성할 때 각 값에 이름을 할당할 수도 있음

let myTuple = (count: 10, length: 432.433, message: "This is a String")

▶print(myTuple.message)

튜플의 가장 강력한 점은 함수에서 여러 값들을 한 번에 반환하는 것

스위프트 옵셜널 타입

: 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환함

▶Int("100") 은 100이 아닌 Optional(100)을 리턴함,print(Int("100")), Int형 initializer

▶Int("Hi") 은 정수 값을 반환할 수 없음, 아무런 값도 반환할 수 없다는 의미로 nil을 반환

▶Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없음

▶nil도 저장하려면 옵셔널 타입으로 선언해야 함

- 옵셔널하게 변수를 선언하기 위해서는 타입 선언부 뒤에 “?” 문자를 씀

※주의 : 변수명 뒤에 “?”하는 것 아님

 

ex)

var index: Int?

if index != nil { 

    // index 변수에 할당된 값이 있다

 } else { 

    // index 변수에 할당된 값이 없다

 }

 

옵셔널 변수는 초기화하지 않으면 자동으로 nil로 초기화

옵셔널 타입 강제 언래핑(forced unwrapping) 1

- !는 forced unwrapping operator : 이 값의 유효성을 확인했으니 값을 추출하여 사용하라

var index : Int?

index = 2

var Array = ["A", "B", "C", "D"]

if index != nil{

    print(Array[index!])

} else {

    print("index does not contain a value")

}

-> C

var index : Int?

var Array = ["A", "B", "C", "D"]

if index != nil{

    print(Array[index!])

} else {

    print("index does not contain a value")

}

-> index does not contain a value

 

옵셔널 타입 강제 언래핑(forced unwrapping) 2

var index : Int?

index = 3

var Array = ["A", "B", "C", "D"]

if let value = index{   //옵셔널 변수 값을 상수 myvalue에 대입

    print(Array[value])

} else{

    print("index does not contain a value")

}

- 위의 코드는 두 가지 작업을 한다

1. 첫 번째, 지정된 옵셔널이 값을 가지고 있는지를 확인

2. 두 번째, 옵셔널이 값을 가지고 있으면 선언된 상수에 그 값을 할당하고 구문의 블록에 있는 코드가 실행

※myvalue 상수는 임시 상수이므로 if 문의 영역 안에서만 유효함 (if 문의 실행이 끝나면 그 상수는 더 이상 존재하지 않음)

- 하나의 구문에 두 개의 옵셔널을 언래핑하기 위하여 옵셔널 바인딩을 사용

ex)

var pet1: String?

var pet2: String?

pet1 = "cat"

pet2 = "dog"

if let firstPet = pet1, secondPet = pet2 {

print(firstPet)

print(secondPet)

} else {

print("insufficient pets")

}

- 불리언 조건을 검사하기 위하여 where 절을 사용

ex)

if let firstPet = pet1, secondPet = pet2 where petCount > 1 {

print(firstPet)

print(secondPet)

} else {

print("no pets")

}

옵셔널 타입 암묵적 언래핑(implicitly unwrapping)

- 옵셔널이 항상 유효한 값을 가질 경우

ex)

var index: Int! // 옵셔널은 이제 암묵적인 언래핑 // Int?에서 느낌표가 됨

index = 3

var treeArray = ["Oak", "Pine", "Yew", "Birch"]

if index != nil {

print(treeArray[index]) // index!에서 느낌표가 사라짐

} else {

print("index does not contain a value")

}

- 클래스 초기화에서 많이 사용