본문 바로가기

iOS/Swift

[Swift] 기초문법

공부한 것을 토대로 작성한 거라 정확하지 않을 수 있음

용어 이해를 위해 정리해보았다!

 

변수, 상수 선언

  • var : 변수선언
  • let : 상수선언
var str = "Hello, playground"   // Hello, playground
str = "Hello, Swift"            // Hello, Swift
let constStr = str              // Hello, Swift
constStr = "Hello, world"       // error

 

타입 지정

  • var variableName: Type
var nextYear: Int
var bodyTemp: Float
var hasPet: Bool

 

숫자와 불린 타입

  • 정수 : Int
  • 32비트 실수 : Float
  • 64비트 실수 : Double
  • 80비트 실수 : Float80
  • 불린 : true, false

 

컬랙션 타입(Collection Type) : 데이터들의 집

array : 배열은 강타입(Strong Type) 지정된 타입의 값만 저장

var arrayofInts: Array<int>      // 배열에 대한 표시
var arrayofInts2: [Int]          // 배열에 대한 축약적 표시

 

Dictionary
<key, value> 쌍의 값을 저장하는 자료구조.  key는 유일한 값이어야 한다
순서가 없다. 즉 저장된 순서 등은 의미가 없다.
순서가 있는 것 : 배열, 큐, 스택

var dictionaryOfCapitalsByCountry: Dictionary<String, String>
var dictionaryOfCapitalsByCountry2: [String: String] // 딕셔너리에 대한 축악적 표시

 

Set : 집합
<key> 값들을 저장하는 자료구조.  key는 유일한 값이어야 한다. 
순서가 없다.

var winningLottryNumbers: Set<Int>

 

리터럴

  • 리터럴 : 값 그 자체를 의미한다.
    예시 ) 1, 23, 345.6, "SYKIM", true
  • 상수와 리터럴은 다르다. 상수는 변수인데 그 값이 하나로 고정된 것이다.
let SY : "KIM"                  //SY->변수 "KIM"->리터럴

 

서브 스크립트

  • 집합의 특정 member elements에 간단하게 접근할 수 있는 문법이다.
  • 추가적인 메소드 없이 특정 값을 할당하거나 가져올 수 있다.
  • array[index]로 배열의 인스턴스 항목에 접근,  dictionary[key]로 딕셔너리 인스턴스 항목에 접근하는 것 또한 서브스크립트이다

기본 형태

//기본형태
subscript(index: Int) -> Int {
 get {
  // 반환 값
 }
 set(newValue) {
  // set 액션
 }
}

 

읽기 전용

// get으로 동작
subscript(index: Int) -> Int {
 // 반환 값
}

 

예시)

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])") // 18

 

이니셜라이저 (Initializer) 

  • 클래스, 구조체, 열거형 인스턴스를 사용하기 위한 준비 작업이다.
  • 저장 프로퍼티의 초기 값을 설정한다.
  • 초기값을 정할 땐 저장 프로퍼티에 초기값을 저장하거나, init()을 사용하여 초기화를 하는 방법이 있다.

기본형태 (기본형태는 인수가 없다)

init() {

}

 

예시)

struct Position {
    var X: Int?
    var Y: Int
    
    init(Y: Int) {
        self.Y = Y
    }
}

var po1 = Position(Y: 35)
print(po1) // Position(x: nil, Y: 35)
po1.X = 70
print(po1) // Position(X: Optional(70), X: 35)

 

프로퍼티(property)

  • 타입의 인스턴스(객체)와 연관된 값이다.
    클래스, 구조체, 열거형과 연관되어 있는 정보 / 값 등을 의미한다.
  • 예시 ) Bool타입의 isEmpty, Array<T>타입의 count
  • 저장프로퍼티 : 값을 저장하고있는 프로퍼티. (상수, 변수 등)
  • 연산프로퍼티: 값을 저장하고 있지 않고 그때그때 특정한 연산을 통해 값을 리턴한다.

저장프로퍼티

var x: Int = 0                      //저장프로퍼티
let countingUp = ["one", "two"]
let secondElement = countingUp[1]   //two
countingUp.count                    // 2

 

연산프로퍼티

class Person {
    var name: String = "Sodeul"
 
    var alias: String {
        get {
            return name
        }
        set(name) {
            self.name = name
        }
    }
}

 

예시)

class Person {
    var name: String = "Lee"
 
    var alias: String {
        get {
            return self.name + " is my FamilyName"
        }
    }
}

var person: Person = Person()
print(person: alias)   // Lee is my FamilyName

 

인스턴스 메소드

  • 타입의 인스턴스에서 호출하는 함수.
var countingUp = ["one", "two"]
let secondElement = countingUp[1]
countingUp.append("three")         //인스턴스메소드

 

옵셔널

  • 타입 이름 뒤에 ?을 붙여 표시한다.
  • 옵셔널 변수는 값을 저장하지 않을 수도 있으며, 값을 nil로 저장할 수 있다.
  • 옵셔널이 아닌 변수는 반드시 값을 저장해야 하며, nil값을 저장할 수 없다.
var anOptionalFloat : Float?
var anOptionalArrayOfStrings: [String]?
var anArrayOfOtionalStrings: [String?]
var anOptionalArrayOfOptionalStrings: [String?]?

var reading1: Float?             //nil
var reading2: Float?             //nil
var reading3: Float?             //nil
var reading4: Float              //error

 

언래핑

  • 옵셔널 변수의 값을 읽기 전에 nil이 아님을 확실히하는것
var optionalV1: Float? = 10.0
var optionalV2: Float?
var nonoptionalV1: Float = 20.0
var nonoptionalV2: Float
optionalV2 = optionalV1          //10.0
optionalV2 = nonoptionalV1       //20.0
nonoptionalV2 = optionalV1       //문법적 에러. 일반 변수는 nil값을 가질 수 없다.
nonoptionalV2 = nonoptionalV1    //20.0

 

강제언랩핑

  • 옵셔널 변수에 ! 을 붙이는 것
var optionalV1: Float? = 10.0
var nonoptionalV1: Float = 20.0
var nonoptionalV2: Float
nonoptionalV2 = optionalV1!       //10.0 

var optionalV1: Float?
var nonoptionalV1: Float = 20.0
var nonoptionalV2: Float
nonoptionalV2 = optionalV1!       //error

 

  • 값이 존재할경우 언래핑을 하면 오류가 발생하지않지만,
  • 값이 존재하지않을경우(nil) 언래핑을 시도하면 오류가 발생한다.
//강제언래핑 예시1
var reading1: Float? = 9.8        // 9.8
var reading2: Float? = 9.2        // 9.2
var reading3: Float? = 9.7        // 9.7
let avgReading = (reading1 + reading2 + reading3)/3    // error because of unwrapping
                                                       // +연산자는 기본적으로 operand가 nil 이 될 수 없기 때문에 에러발생
let avgReading = (reading1! + reading2! + reading3!)/3 // OK


//강제언래핑 예시2
var reading1: Float? = 9.8        // 9.8
var reading2: Float? = 9.2        // 9.2
var reading3: Float?              // nil
let avgReading = (reading1 + reading2 + reading3)/3    // error because of unwrapping
let avgReading = (reading1! + reading2! + reading3!)/3 // error because reading3 is nil

 

옵셔널 바인딩

  • 강제 언래핑의 문제점을 해결
  • if문을 사용하여 nil이 아닌 경우에만 옵셔널 변수를 사용하도록 한다.
if let r1 = reading1, r2 = reading2, r3 = reading3{
    let avgReading = (r1 + r2 + r3)/3
}
else{
    let errorString = "Instrument reported a rading that was nil"
}

 

딕셔너리에서 서브스크립팅하기.

let nameByParkingSpace = [13:"Alice", 27:"Bob"]
let space13Assignee: String? = nameByParkingSpace[13]   // Alice
let space42Assignee: String? = nameByParkingSpace[42]   // nil
if let space27Assignee = nameByParkingSpace[27]{
    print("Key 27 is assigne in the dictionary")
}

 

루프

제어문들

  • if-else, while, for, for-in, repeat-while, switch등이 있으나 다른 언어와 달리 괄호를 사용하지 않는다는 차이가 있다.
for var i=0; i<countingUp.count; i=i+1 {
    let string = countingUp[i]
    //string
}
//
let range = 0..< countingUp.count
for i in range {
    let string = countingUp[i]
    //string
}
//
for string in countingUp{
    //string
}
//
for (index, number) in countingUp.enumerated(){
    //(0, "one"), (1,"two")  형식으로 리턴
    //enumerated()는 튜플을 리턴하는 함수이다
    //(n, x)로 이루어진 쌍을 리턴 (튜플 형태로 리턴)
}

 

문자열 삽입

문자열에 변수값 삽입 

 

형태

 "\(name) \(age)" // printf("%s %d", name, age)

 

예시

let nameByParkingSpcae[13:"Alice", 27:"Bob"]
for(space, name) in nameByParkingSpcae{
    let permit = "Space \(space): \(name)"
    
}

 

열거형과 switch

열거형 (enum)

  • 같은 부류에 속하는 값들을 묶어서 표현할 수 있는 타입이다.
  • 공통된 주제에 대해서 이미 정해놓은 입력값만 선택해서 받고 싶을 때 사용한다.

정의

enum 이름(첫글자 대문자) {
	case 이름1
	case 이름2
	case 이름3, 이름4, 이름5
	// ...
}

 

예시)

enum PieType{
    case Apple
    case Cherry
    case pecan
}
let favoritePie = PieType.Apple

 

switch

  • 모든 경우를 다 포함하여하 한다.
  • C와는 달리 반드시 매치되는 경우만 실행한다.
let name:String
switch favoritePie{
    case .Apple:
        name = "Apple"
    case .Cherry:
        name = "Cherry"
    case.Pecan:
        name = "Pecan"
}

 

fallthrough

  • fallthrough 키워드를 사용하면 break 되는 것을 무시할 수 있다.
let osxVersion: Int = ...
switch osxVersion{
case 0...8:
    print("A big Cat")
    //break쓰지 않아도 자동으로 break된다
case 9:
    print("Mavericks")
    fallthrough // 이 case를 마치고 switch 구문을 탈출하지 않고, 아래 case로 계속 진행한다.
case 10:
    print("Vosemite")
default:
}

 

열거형과 원시값

  • 선언 시점에서 지정한 원시값은 변환이 불가하다.
  • 대부분 정수이나 문자열 실수등도 가능하다.
  • 정수일 때 값을 명시적으로 주지 않으면 값이 자동으로 증가한다. (타입을 반드시 지정해주어야한다.)
  • 문자열 또한 값을 명시적으로 주지 않으면 case이름과 동일한 값을 자동으로 가지게 된다. (타입 반드시 지정)

 

정수형

enum PieType: Int{
    case Apple = 0  // 0이 원시값(raw value)
    case Cherry     // 자동적으로 1
    case pecan      // 자동적으로 2
    case Grape = 100
    case Berry      // 자동적으로 101
}
if let pieType = PieType(RawValue: 13) {
    // raw값(원시값)이 13인것이 있을 경우
}

 

문자열

enum PieType: String{
    case Apple = "Apple"  // Apple
    case Cherry           // 자동적으로 Cherry
    case pecan            // 자동적으로 pecan
    case Grape = "GG"     // GG
    case Berry            // 자동적으로 Berry
}

 

값에 접근

  • rawValue 속성을 이용해 값에 접근할 수 있다.
enum PieType: Int{
    case Apple  = 0  
    case Cherry = 1    
    case pecan  = 2    
    case Grape  = 3
    case Berry      
}

PieType(rawValue: 1)             // Cherry   -> 동일한 rawValue를 가진 case인 Cherry를 가져온다.
PieType(rawValue: 777)           // nil      -> 동일한 rawValue를 가진 case 없어 nil을 가져온다.
let pie = Berry.Grape.rawValue   // pie is 4

 


 

http://developer.apple.com/swift

 

Swift - Apple Developer

Swift is a powerful and intuitive programming language for iOS, iPadOS, macOS, tvOS, and watchOS. Writing Swift code is interactive and fun, the syntax is concise yet expressive, and Swift includes modern features developers love. Swift code is safe by des

developer.apple.com

https://seons-dev.tistory.com/entry/Swift-%EA%B8%B0%EC%B4%88%EB%AC%B8%EB%B2%9520-%EC%8A%A4%EC%9C%84%EC%B9%98-Switch

 

Swift : 기초문법 [스위치 - Switch(break/fallthrough)]

목차 Switch switch 구문도 소괄호( () )를 생략할 수 있습니다. 단, break 키워드 사용은 선택 사항입니다. 즉, case 내부의 코드를 모두 실행하면 break 없이도 switch 구문이 종료된다는 의미입니다. 이것

seons-dev.tistory.com

https://babbab2.tistory.com/116

 

Swift) 열거형(Enumeration) 기초편

안녕하세요 :) 소들입니다!!! 오랜만에 재밌는 문법 포스팅~~~.~~~~ 오늘 공부해볼 것은 열거형이라는 것이에요!!!!! Enum, 풀네임은Enumeration이라는 것인데, Swift에선 이 열거형을 처음쓸 때 되게 헷갈

babbab2.tistory.com

https://babbab2.tistory.com/123

 

Swift) 서브스크립트(Subscript) 정복하기

안녕하세요!?! 소들입니다!!!!!!!!! :D 오늘은 서브스크립트(Subscript)에 대해 알아볼 거예요!!! 이렇게 하나하나 Swift를 정복하다보면.. 언젠가 Swift 왕이 되어 있기를 간절히 바라며.....👑 이번에도

babbab2.tistory.com

https://medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-subscript-2288551588f9

 

오늘의 Swift 상식 (Subscript)

서브스크립트란?

medium.com

https://medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-%EC%B4%88%EA%B8%B0%ED%99%94-%EA%B0%92-%ED%83%80%EC%9E%85%EC%9D%98-initializer-1e3d329050c6

 

오늘의 Swift 상식 (초기화, 값 타입의 Initializer)

초기화

medium.com