전광판


전광판 스토리보드

image

Outlet Action

image

image

Animate

image

image -=를 += 로 수정하면 움직이는 방향이 반대 방향이 된다.

연산자


증감 연산자

image

범위 연산자

image

Nil-Coalescing Operator (Nil합병연산자) ??

image

var x : Int?
//x = 1
//print(x)
var xx = x ?? 0 // x가 nil이면 0을 출력
print(xx)

제어문


내 이름을 5번 출력하기

스크린샷 2024-03-28 오전 10 15 59

Swift에서 x를 사용하지 않기 때문에 _를 추천하고있다.

image

x를 사용하는 소스

// 1부터 5까지의 숫자를 순회하는 for-in 반복문 시작
for x in 1...5 {
    // 현재 숫자(x)와 문자열 " : Choimu"를 결합하여 출력
    print("\(x) : Choimu")
}

if문 조건에서 콤마 : 조건 나열(condition-list)

image

Optional


forced unwrapping 1

var x : Int? = 10 // Optional type은 ?나 !를 붙여서 사용
print (x, x!) // Optional을 풀어서 사용해야한다.
/* Optional을 푸는 방법1.
   !을 붙인다. (forced unwrapping)
   단 Optional 값이 없을 때 (nil) 바로 !를 붙여서 강제 언래핑을 하면 Crash가 발생한다.
*/

forced unwrapping 2

var x : Int? = 10
if x != nil { // 주의! x!=nil이라고 쓰면 안됨 
    print(x!)
}
/* nil이 아닐 경우 강제 언래핑을 한다는 조건문을 추가해야 Crash를 방지할 수 있다.
 */

Optional Binding

var x : Int?
x = 10
if let x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
    /// Swift 5.7 이후부터 가능한 short form if let x =x 와 같음
    print(x)
}
else {
    print("nil")
}
var x1 : Int?
if let xx = x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
    print(xx)
}
else {
    print("nil")
}

여러 옵셔널 언래핑

var x : Int?
var y : Int?
x = 1
y = 2 // x,y 둘 중 하나라도 값이 없다면 nil이 출력이 된다.
if let x, let y{
    print(x,y)
}
else {
    print("nil")
}

Optional을 unwrapping하는 여러가지 방법 (guard-let 제외)

image

무드등 앱에 들어간 Optional

image

두 가지 Optional Type

image

Implicity Unwrapped Optional

image

let x : Int? = 1
let y : Int = x!
let z = x
print(x,y,z) //Optional(1) 1 Optional(1) 
print(type(of:x),type(of:y),type(of:z)) //Optional<Int> Int Optional<Int>
let a : Int! = 1 //Implicitly Unwrapped Optional
let b : Int = a //Optional로 사용되지 않으면 자동으로 unwrap함 let c : Int = a!
let d = a //Optional로 사용될 수 있으므로 Optional형임
let e = a + 1
print(a,b,c,d,e) //Optional(1) 1 1 Optional(1) 2 
print(type(of:a),type(of:b),type(of:c),type(of:d), type(of:e))
//Optional<Int> Int Int Optional<Int> Int

Int? VS Int!

Swift에서 Int?Int!는 옵셔널(Optional) 타입을 나타내는 두 가지 다른 방법입니다. 옵셔널은 값이 있거나 nil일 수 있는 변수를 선언할 때 사용됩니다. 그러나 Int?Int! 사이에는 중요한 차이점이 있습니다.

Int?

Int?는 옵셔널 Int를 나타내며, 이 변수는 정수 값을 가지거나 nil을 가질 수 있습니다. Int? 타입의 변수에 접근할 때는 옵셔널 바인딩(optional binding)이나 옵셔널 체이닝(optional chaining) 등을 통해 안전하게 값을 추출해야 합니다. 값이 nil인 경우에 대해 명시적으로 처리해 주어야 합니다.

var optionalNumber: Int? = nil

// 옵셔널 바인딩을 사용하여 안전하게 값을 추출
if let number = optionalNumber {
    print("옵셔널에는 \(number)이/가 있습니다.")
} else {
    print("옵셔널에 값이 없습니다.")
}

Int!

Int!는 암시적 추출 옵셔널(Implicitly Unwrapped Optional)을 나타냅니다. 이는 변수가 처음에 nil을 가질 수 있지만, 처음 사용되는 시점에는 반드시 값이 존재할 것이라고 확신할 때 사용합니다. Int! 타입의 변수를 사용할 때는 옵셔널 바인딩 없이도 직접 값을 접근할 수 있지만, 만약 값이 nil인 상태에서 접근한다면 런타임 오류가 발생할 수 있습니다. 따라서 사용에 주의가 필요합니다.

var implicitlyUnwrappedOptionalNumber: Int! = nil

// 나중에 값 할당
implicitlyUnwrappedOptionalNumber = 10

// 옵셔널 바인딩 없이 직접 사용
print("암시적 추출 옵셔널에는 \(implicitlyUnwrappedOptionalNumber)이/가 있습니다.") // 10이 출력됨

// 만약 암시적 추출 옵셔널이 nil인 상태에서 접근하면 런타임 오류 발생

요약

  • Int?는 값이 있거나 nil일 수 있는 옵셔널입니다. 값에 접근하기 위해서는 안전한 방법(옵셔널 바인딩 등)을 사용해야 합니다.
  • Int!는 처음에는 nil이 될 수 있지만, 사용 시점에는 반드시 값이 존재한다고 가정하는 암시적 추출 옵셔널입니다. 직접 접근할 수 있지만, nil 상태에서 접근하면 오류가 발생합니다.

두 타입 모두 옵셔널이지만 사용 상황과 방법에 따라 적절히 선택하여 사용해야 합니다.

함수


image

C -> Swift 함수 변경 연습

//int add(int x, int y) { //C, C++
//return(x+y);
//}
//add(10,20);

func add (x : Int, y : Int) -> Int{
    print(#function) // add(x:y:) 까지가 함수명
    return x+y
}
print(add(x: 10,y: 20))
print(type(of: add)) // (Int, Int) -> Int

func add1(first x : Int, second y : Int) -> Int{
    print(#function) // add1(first:second:) 까지가 함수명
    return x+y
}
print(add1(first: 10,second: 20))
print(type(of: add1)) // (Int, Int) -> Int

func add2 (_ x : Int, _ y : Int) -> Int{
    print(#function) // add2(_:_:) 까지가 함수명
    return x+y
}
print(add2(10,20))
print(type(of: add2)) // (Int, Int) -> Int

func add3 (_ x : Int, with y : Int) -> Int{
    print(#function) // add3(_:with:) 까지가 함수명
    return x+y
}
print(add3(10, with : 20))
print(type(of: add3)) //(Int, Int) -> Int

UITableViewDataSource

// Return the number of rows for the table.     
// 자료형 (UITableView,Int) -> Int
// 함수명 tableView(_:numberOfRowsInSection:)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return 0
}


// Provide a cell object for each row.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // Fetch a cell of the appropriate type.
   let cell = tableView.dequeueReusableCell(withIdentifier: "cellTypeIdentifier", for: indexPath)
   
   // Configure the cell’s contents.
   cell.textLabel!.text = "Cell text"
       
   return cell

}

디폴트 매개변수(Default Argument)

image

func add (x : Int, y : Int = 3) -> Int{
    print(#function) // add(x:y:)
    return x+y
}
print(add(x: 10))//13 y=3 (Default Argument)

Animate

image

class func animate(
    withDuration duration: TimeInterval,
    animations: @escaping () -> Void,
    completion: ((Bool) -> Void)? = nil // =nil -> Default Argument

    // 자료형 (TimeInterval, @escaping () -> Void, ((Bool) -> Void)?)
)

클래스


image image

Stored Property

image

Outlet 부분에 초기값을 줄 수 없기 때문에 Optional(!)을 사용했다.

메서드(Method)

class Man{
    var age : Int = 1
    var weight : Double = 3.5
    func display(){ //인스턴스 메서드
        print("나이=\(age), 몸무게=\(weight)")
    }
}

var x : Int
var soft = Man()
print(soft.age) // 1
print(soft.weight)// 3.5
soft.display() // 나이 = 1, 몸무게 = 3.5








출처


  • Smile Han의 iOS 프로그래밍 실무, 한성현(출판 예정), PPT로 제공
  • Do it! 스위프트로 아이폰 앱 만들기 입문(개정 7판)(이지스퍼블리싱,송호정, 이범근, 2023.1)
  • 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍(제이펍, 닐 스미스, 2023.12)
    • https://www.techotopia.com/index.php/IOS_iPhone_iPad_eBooks
  • 스위프트 프로그래밍(Swift 5) 3판(한빛미디어, 야곰, 2019.10)
  • 꼼꼼한 재은 씨의 스위프트 기본편 (루비페이퍼, 이재은, 2018.05)
  • 꼼꼼한 재은 씨의 스위프트 실전편 (Swift) (루비페이퍼, 이재은, 2018.08)
  • 꼼꼼한 재은 씨의 Swift 문법편 (루비페이퍼, 이재은, 2017.12)