전광판
전광판 스토리보드
Outlet Action
Animate
-=를 += 로 수정하면 움직이는 방향이 반대 방향이 된다.
연산자
증감 연산자
범위 연산자
Nil-Coalescing Operator (Nil합병연산자) ??
var x : Int?
//x = 1
//print(x)
var xx = x ?? 0 // x가 nil이면 0을 출력
print(xx)
제어문
내 이름을 5번 출력하기
Swift에서 x를 사용하지 않기 때문에 _를 추천하고있다.
x를 사용하는 소스
// 1부터 5까지의 숫자를 순회하는 for-in 반복문 시작
for x in 1...5 {
// 현재 숫자(x)와 문자열 " : Choimu"를 결합하여 출력
print("\(x) : Choimu")
}
if문 조건에서 콤마 : 조건 나열(condition-list)
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 제외)
무드등 앱에 들어간 Optional
두 가지 Optional Type
Implicity Unwrapped Optional
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
상태에서 접근하면 오류가 발생합니다.
두 타입 모두 옵셔널이지만 사용 상황과 방법에 따라 적절히 선택하여 사용해야 합니다.
함수
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)
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
class func animate(
withDuration duration: TimeInterval,
animations: @escaping () -> Void,
completion: ((Bool) -> Void)? = nil // =nil -> Default Argument
// 자료형 (TimeInterval, @escaping () -> Void, ((Bool) -> Void)?)
)
클래스
Stored Property
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)