Step by Step

Swift 기본 문법 정리 본문

ios 앱 개발

Swift 기본 문법 정리

짤진이 2025. 3. 24. 16:58
반응형

 

import UIKit

//var greeting = "Hello, playground"
//print(greeting)

Int8.max
Int8.min
Int64.max
Int64.min

var name:String = "전우치"
var greeting = "안녕하세요"

name = "이순신"
greeting += " " + name
print(greeting)

 

import UIKit

let i:Int = 10
//var d:Double = i //Error

let r:Double = 0.1

식별자

- 카멜 케이스라는 방식으로 대소문자를 기술하도록 되어있음.

UpperCamelCase : 형식명, 클래스명에 사용한다.

   Int, Void, AnyObject

lowerCamelCase : 메서드명, 변수명에 사용한다.

   message, totalCount, localizedDescription

 

엔트리 포인트로 사용되는 main()함수가 없다:
  • 기존 Objective-C에는  main()함수가 있었지만 Swift로 작성된 앱에서는 @main 어노테이션을 사용해서 앱의  시작 객체를 지정한다.
 

Swift 문법적 특징:

  • 헤더 파일을 작성할 필요가 없다.
  • 대소문자를 구분한다.
  • 구문 끝에 세미콜론은 옵션이다.
  • 문자열뿐만 아니라 문자도 큰따옴표를 사용한다. 문자를 구분할 필요가 있으면 Character형으로 명시한다.
  • Objective-C는 C언어에 기반한 언어라서 개별 객체를 참조할 때 반드시 import 구문을 사용했지만 Swift에서 import는 프레임워크나 외부 라이브러리를 사용하기 위한 목적으로만 사용한다.
 
import UIKit

let name = "전우치"
let count = name.count
let url = "www.credu.com"
let hasProtocol = url.hasPrefix("https://")
print("\(name) has \(count) characters") // 전우치 has 3 characters

 

Tuple 타입

  • 튜플은 컴마(,)로 구분된 값을 리스트이다. 간단한 값의 묶음을 표현하는데 활용도가 높다.
  • 구조체를 정의해서 해결할 수 있지만 단순히 값을 저장하는 공간이 필요하면 튜플을 이용하는것이 보다 간단하다.
import UIKit

let employee = (100, "전우치", "과장")
employee.0

let employee2:(id:Int, name:String, title:String) =
  (200, "이순신", "부장")
employee2.id
employee2.name

 

컬렉션

  • 컬렉션은 특정 타입의 인스턴스 값을 모아놓은 집합이다. 튜플과 유사하지만 컬렉션이 보다 다양한 기능을 가진다.
  • Swift에서 사용하는 컬렉션은 3가지가 있으며, Array는 인스턴스들의 순서를 가지고 있는 컬렉션이며, Array구조체의 인스턴스이다.
  • Dictionary는 키와 값의 쌍을 이루는 컬렉션이며, Dictionary구조체의 인스턴스이다.
  • Set은 순서없이 모여있는 구조체라서 집합연산에 적당하며 Set구조체의 인스턴스이다.

 

import UIKit

var device:Array<String> = ["ipone", "ipad","android", "window"]
var number:[Int] = [1,2,3,4,5]
device += ["mac"]
device.append("pc")
for d in device{
    print(d)
}
device.remove(at:1)
print(device) //["ipone", "android", "window", "mac", "pc"]
print(device.count) //5

typealias Time = (h:Int, m:Int, s:Int)
typealias Duration = (start:Time, end:Time)
let today:Duration = ((9,30,1),(13,30,1))
print("오늘 우리가 공부한 시간은 \(today.end.h - today.start.h)") //오늘 우리가 공부한 시간은 4

 

Dictionary

  • Dictionary란 키와 값의 쌍으로 이루어진 컬렉션이다.
  • Array가 순서대로 값을 저장하는 컬렉션이라면 Dictionary는 값에 이름을 주고 저장하는 컬렉션이다.
  • 특정 값을 저장할 때 키를 지정하며 저장한 값에 접근할 때도 그 키를 이용한다. 새로운 키와 값을 주고 추가하거나 기존 키에 값을 수정할 수 있다. 

 

 

키 값은 겹치면 안되고 키로만 접근, 검색이 가능하다.

var deviceDict:[String:Int] = 
  ["iphone":5,"ipad":10,"android":20,"windowPhone":10]
deviceDict["mac"] =20
deviceDict["iphone"] =6
deviceDict.removeValue(forKey:"windowPhone")
print(deviceDict["iphone"]!)
for (name,count) in deviceDict{
   print("\(name) :\(count)")
}

 

옵셔널 => nill일 가능성

값이 없을수도 있으니 체크하고 옵셔널 바인딩이라는 구문을 거쳐서 접근한다.

=> !(강제추출연산자)를 사용해서 먼저 체크하는 것이 정석이다

 

//딕셔너리
var deviceDict:[String:Int] = ["아이폰":5, "아이패드":10, "갤럭시":15]
deviceDict["mac"] = 20
deviceDict["ipone"] = 30
print(deviceDict) //["아이패드": 10, "갤럭시": 15, "아이폰": 5, "mac": 20, "ipone": 30]
deviceDict.removeValue(forKey: "아이패드")
print(deviceDict["아이폰"]!) //5
for item in deviceDict {
    print("\(item.key), \(item.value)")
}
//갤럭시, 15
//아이폰, 5
//mac, 20

 

옵셔널(Optional)

  • 옵셔널은 값이 없을 수 있는 가능성을 다룬다.
  • nill은 값이 없는 상태를 나타낸다.
  • 변수를 옵셔널로 만들려면 변수의 타위뒤에 ?를 붙이면 된다.

 

강제추출연산자

  • 강제 추출은 옵셔널 변수안에 nil이 아닌 값이 존재한다고 확신할 때 사용하는 옵셔널 접근 방법이다. 하지만 값의 존재를 개발자가 확신하는 것은 수 많은 에러를 발생시킬 수 있다.
  • !가 많이 들어간 코드는 크래시를 일으킬 가능성이 높은 코드될 수 있다. 
 

옵셔널 바인딩(Optional Binding)

  • 강제 언래핑의 안전성을 조금 높일 수 있는 방법은 다음과 같이 변수가 nil이 아닌지 확인한 뒤에 nil이 아닌 경우에만 강제 언래핑을 하는 것이다.

 

옵셔널 체인

 

 

매개변수명 기술에 주의

  • 함수 호출시에 매개변수명을 라벨처럼 붙여야 한다.
  • 애플 라이브러리의 특징은 함수명 또는 메서드명이 길다는 부분이다. 입력되는 데이터를 기술하는 형태의 이름이 길게 나열된다. 
import UIKit

func printHelloWithName(name:String, welcomeMessage:String){
    print("\(name)님, \(welcomeMessage)")
}

printHelloWithName(name: "전우치", welcomeMessage: "안녕")

 

구조체

import UIKit

struct Coding{
    var name:String?
    var time:Int?
}
var iosCoding = Coding(name:"앱개발", time: 10*60)
var winCoding = Coding()
winCoding.name = "윈도우 앱 개발"
print(winCoding.name) //Optional("윈도우 앱 개발")
struct Coding{
    var name:String?
    var time:Int?
}
//var iosCoding = Coding(name:"앱개발", time: 10*60)
//var winCoding = Coding()
//winCoding.name = "윈도우 앱 개발"
//print(winCoding.name) //Optional("윈도우 앱 개발")
var IOS = Coding(name:"IOS",time :200)
var win = Coding()
win.name = "윈도우 프로그래밍"
print("\(IOS.name!)")
print("\(win.name!)")

 

값만 복사되는 코드

import UIKit

struct Resolution {
    var width = 0
    var height = 0
    func desc() -> String{
        return "Resolution 객체"
    }
}

class VidioMode {
    var interlaced = false
    var frameRate = 0.0
    var name : String?
    var resolution:Resolution = Resolution()
    func desc() -> String{
        return "VideoMode 클래스"
    }
}

//값이 복사되는 코드
let hd = Resolution(width:2048, height:1024)
var cinema = hd
cinema.width = 3840
print("hd:\(hd.width), cinema:\(cinema.width)") //hd:2048, cinema:3840

//참조가 복사되는 코드
let video = VideoMode()
video.name = "original"
let dvd = video
dvd.name = "DVD로 보기"
print("video: \(video.name!), dvd:\(dvd.name!)") //video: DVD로 보기, dvd:DVD로 보기

 

Struct에서의 복사는 깊은 복사 느낌...?

복사된 구조체를 변경하면 원본이 변경되지 않는다.

하지만 Class에서는 얕은 복사 느낌

복사된 객체를 변경하면 원본이 변경된다.

반응형

'ios 앱 개발' 카테고리의 다른 글

Delegate 패턴  (0) 2025.03.26
ViewController 간 Data 교환  (0) 2025.03.26
Swift(Segueway 화면전환)  (2) 2025.03.26
Swift 기본문법(3)  (1) 2025.03.25
Swift 기본문법(2) 옵셔널 바인딩, 초기화  (0) 2025.03.25