브래의 슬기로운 코딩 생활
iOS프로그래밍 실무 3주차 정리 본문
오늘은 거의 전부 지난주차 내용 복습만 했다.
아마도 저번주 내용이 중요도가 높기도 하고 동영상 강의 였어서 그런 것 같다.
이번 시간에 교수님 께서 언급하시고 중요한 내용만 일단 정리해 보겠다.
일반적으로 초깃값을 주지 않을 경우에만 자료형을 씀
정수 데이터 타입 : Int
부동 소수점 데이터 타입: Double
부울 데이터 타입 : Bool
문자 데이터 타입 : Character
문자열 데이터 타입 : String
변수 : var
상수 : let
튜플(Tuple)
Void는 빈 튜플 이다. = ()
typealias Void = ()*
()는 빈 튜플(empty tuple)
함수(메서드)를 선언할 때 반환 값이 없으면 반환형을 지정할 필요 없음
그러나 함수, 메서드 또는 클로저의 형(type)에는 반환형 반드시 작성
- 리턴값이 없는 함수의 형을 작성할 때는 반드시 Void 지정
반환값이 없는 클로저, 함수(메서드)를 선언할 때는 Void나 빈 튜플(())을 반환 형으로 사용
func logMessage(_ s: String) { // {앞에 ->Void나 ->() 생략
print("Message: \(s)")
}
let logger: (String) -> Void = logMessage //여기서 ->Void는 생략 불가
logger("Hello")
옵셔널 타입(매우 중요)
Optional(10)
- Int? / Int!
- Int형 값을 저장 or 값이 없음(nil)
- var y : Int? = 10 //y?
- var z : Int! //z?
값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환함
- Int("100") // 100이 아닌 Optional(100)을 리턴함,print(Int("100")), Int형 initializer
- Int("Hi") // 정수 값을 반환할 수 없음, 아무런 값도 반환할 수 없다는 의미로 nil을 반환
- Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없음
- nil도 저장하려면 옵셔널 타입으로 선언해야 함
- 옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법 제공
- 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 “?” 문자를 씀
옵셔널 타입 강제 언래핑(forced unwrapping)
- 옵셔널 변수에 값이 있으면 옵셔널로 "래핑되었다(wrapped)"고 함
- 옵셔널에 래핑된 값은 강제 언래핑(forced unwrapping)으로 풀어줌
var x : Int?
x = 10
if x != nil {
print(x!)
}
else {
print("nil")
}
var x1 : Int?
if x1 != nil {
print(x1!)
}
else {
print("nil")
}
주의 :
if x!=nil
이라고 쓰면 안됨 //error: 'nil' cannot be assigned to type 'Int'
chatGPT
강제 추출 연산자 !는 피연산자와 꽉 묶이는(tightly associates) 높은 우선순위를 가진다.
즉, 대부분의 다른 연산자보다 먼저 계산되며, 다른 연산자와 함께 사용되는 표현식에서는
피연산자에 밀접하게(bind tightly) 결합되어, 표현식에서 다른 연산자와는 무관하게 즉시
적용된다.
예를 들어, let x = optionalValue! + 5 표현식에서 강제 추출 연산자 !는 덧셈 연산자
+보다 높은 우선순위를 가지므로, 옵셔널 값이 5에 더해지기 전에 먼저 추출된다.
그러나 옵셔널 값이 nil인 경우 런타임 오류가 발생할 수 있으므로, 가능한한 강제 추출
대신 옵셔널 바인딩 또는 옵셔널 체인을 사용하는 것이 좋다.
이렇게 하면 코드를 보다 견고하게 만들어 crash를 피할 수 있다.
optional binding
- 강제 언래핑하는 또 다른 방법으로, 옵셔널 바인딩(optional binding)을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당
if let constantName = optionalName{
//옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantName에 대입하고 if문 실행
//값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}
if var variableName = optionalName {
//옵셔널 변수가 값이 있다면 언래핑해서 일반 변수 varibleName에 대입하고 if문 실행
//값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}
var x : Int?
x = 10
if let xx = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
print(x,xx) // if let x = x 라고 써도 됨, Swift 5.7부터는 if let x 라고 써도 됨 //short form of if-let to the Optional Binding
}
else {
print("nil")
}
var x1 : Int?
if let xx = x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
print(xx)
}
else {
print("nil")
}
Implicitly Unwrapped Optional*
- 형 다음에 ?가 아닌 !를 쓰는 옵셔널 형 // Int!, String!
- 일반 옵셔널 값으로 사용하려고 하지만, optional로 사용할 수 없는 경우 값을 강제로 푼다.
- Optional로 사용되지 않으면 자동으로 unwrap한다.
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
옵셔널 변수에 초깃값을 할당하지 않으면 자동으로 nil이 할당됨
Any와 AnyObject
Any
var x: Any = "Hi"
print(x, type(of:x))
x = 10
print(x, type(of:x))
x = 3.5
print(x, type(of:x))
Nil-Coalescing Operator (Nil합병연산자) ??*
- 옵셔널변수 ?? nil일 때 할당되는 값
- 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
형 변환(as! as?로 downcasting)
- 부모인스턴스 as! 자식클래스
// downcasting 일반 타입으로 반환
// 다운캐스팅이 반드시 성공할 것이라는 확신이 있을 때
- 부모인스턴스 as? 자식클래스
// downcasting 옵셔널 타입으로 반환. 확신이 없을 경우
if문에서 콤마는 AND의미
매개변수 인자 리턴값
메서드(method)
- 특정 클래스, 구조체, 열거형 내의 함수
- 함수를 클래스 내에 선언하면 메서드라 부름
함수를 선언하는 방법
func ― 함수라는 것을 스위프트 컴파일러에게 알려주는 키워드
<함수명> ― 함수에 할당되는 이름
<매개변수 이름> ― 함수 코드 내에서 참조되는 매개변수의 이름
<매개변수 타입> ― 함수에 전달되는 매개변수의 타입
<반환값 타입> ― 함수가 반환하는 결과에 대한 데이터 타입. 반환하지 않으면 “->Void”는 생략 가능
매개변수를 받지 않으며 결과를 반환하지도 않고 오직 메시지만 출력
func sayHello() { //리턴값 없으면( -> Void ) 지정하지 않아도 됨
print("Hello")
}
void sayHello() { //C, C++
printf("Hello");
}
하나의 문자열과 하나의 정수를 매개변수로 받아서 문자열을 반환
func message(name: String, age: Int) -> String {
return("\(name) \(age)")
}
Swift 함수 정의와 호출하기
내부 매개변수 이름 vs 외부 매개변수 이름
함수명이 궁금해요 : #function 리터럴(literal)
Swift 함수명
- 함수명(외부매개변수명:외부매개변수명: ...)
#function 리터럴을 사용하여 얻을 수 있음
func add(first x: Int, second y: Int) -> Int {
print(#function) //add(first:second:)
return(x+y)
}
print(add(first:10, second:20))
-과제-
let myTuple = (count: 10, length: 12.1, message: "Hi")
print(myTuple.message, myTuple.2)
print(type(of:myTuple))
// Hi Hi
// (count: Int, length: Double, message: String)
Void는 빈 튜플(empty tuple)
typealias Void = () / typealias는 별명을 만드는 자료형
var x : Int =10
var y : Int? =10
var z : Int!=10
print (x, y, z)
// 10 Optional(10) Optional(10)
var x : Int =10
var y : Int? =10
var z : Int!=10
print (x, y, z+1)
// 10 Optional(10) 11
var x : Int?
x =1090
if let x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
print(x)
}
else {
print("nil")
}
var x1 : Int?
if let x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
print(x1)
}
else {
print("nil")
}
// 1090
// nil
var pet1: String?
var pet2: String?
pet1 ="cat"
pet2 ="dog"
if let pet1, let pet2 {
print(pet1,pet2)
} else {
print("nil")
}
// cat dog
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(1) 1 Optional(1)
// Optional<Int> Int Optional<Int>
// Optional(1) 1 1 Optional(1) 2
// Optional<Int> Int Int Optional<Int> Int
!옵셔널은 옵셔널 값으로 사용되지 않을 때 자동으로 언래핑 된다.
let defaultAge =1
var age : Int?
age =3
print(age) //Optional(3)
var myAge = age ?? defaultAge
print(myAge) //3
??연산자는 앞에는 옵셔널 값을 쓰고 뒤에는 nil일 경우에 표시 되는 값을 쓴다.
func sayHello() { //->Void or ->() 생략
print("Hello")
} //정의
sayHello() //호출
func add(x: Int, y: Int) ->Int {
print(#function)
return(x+y)
}
print(add(x:100, y:200))
print(type(of:add))
// add(x:y:)
// 300
// (Int, Int) -> Int
func add1(x: Int, y: Int) ->Int {
print(#function)
return(x+y)
}
print(type(of:add1))
func add2(first x: Int, second y: Int) ->Int {
print(#function)
return(x+y)
}
print(type(of:add2))
func add3(_ x: Int, _ y: Int) ->Int {
print(#function)
return(x+y)
}
print(type(of:add3))
func add4(_ x: Int, with y: Int) ->Int {
print(#function)
return(x+y)
}
print(type(of:add4))
add1(x: 0, y: 0)
add2(first: 0, second: 0)
add3(0, 0)
add4(0, with: 0)
// (Int, Int) -> Int
// (Int, Int) -> Int
// (Int, Int) -> Int
// (Int, Int) -> Int
// add1(x:y:)
// add2(first:second:)
// add3(_:_:)
// add4(_:with:)
'2-1 > iOS프로그래밍 실무' 카테고리의 다른 글
iOS프로그래밍 실무 6주차 정리 (0) | 2023.04.12 |
---|---|
iOS프로그래밍 실무 5주차 정리 (0) | 2023.04.05 |
iOS프로그래밍 실무 4주차 정리 (0) | 2023.03.29 |
iOS 프로그래밍 실무 2주차 정리 (4) | 2023.03.12 |
iOS프로그래밍 실무 1주차 정리 (0) | 2023.03.08 |