함수 기본 개념
- 정의: 함수는 특정 작업을 수행하는 코드 블록.
- 매개변수 (Parameters): 함수 정의에서 사용되는 변수로, 함수가 실행될 때 데이터를 받을 자리표시자.
- 인수 (Arguments): 함수 호출 시 실제로 전달되는 값
매개변수와 인수의 차이
- 매개변수: 함수 정의에서 사용되는 변수
- 인수: 함수 호출 시 전달되는 실제 값
반환값
- 함수는 작업이 끝난 후 값을 반환할 수 있으며, 이 반환값은 다른 연산에 사용할 수 있음.
메서드와 함수의 차이
- 메서드 (Method): 특정 클래스, 구조체 또는 열거형 내에 정의된 함수로, 객체 지향 프로그래밍에서 사용.
iOS 테이블뷰에서 많이 사용하는 메서드
- tableView(_:numberOfRowsInSection:)
- 메서드 자료형: func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
- 기능: 지정된 섹션에 표시할 행의 수를 반환합니다. 필수적으로 구현해야 하는 메서드입니다.
- tableView(_:cellForRowAt:)
- 메서드 자료형: func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
- 기능: 지정된 행에 대한 셀을 구성하여 반환합니다. 셀의 내용을 설정합니다.
- tableView(_:didSelectRowAt:)
- 메서드 자료형: func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
- 기능: 사용자가 특정 행을 선택했을 때 호출됩니다. 선택된 행에 대한 동작을 정의합니다.
- tableView(_:heightForRowAt:)
- 메서드 자료형: func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
- 기능: 특정 행의 높이를 반환합니다. 동적으로 높이를 조정할 수 있습니다.
- tableView(_:willDisplay:forRowAt:)
- 메서드 자료형: func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
- 기능: 특정 셀이 화면에 표시되기 직전에 호출됩니다. 셀의 스타일 조정이나 애니메이션을 적용할 수 있습니다.
- numberOfSections(in:)
- 메서드 자료형: func numberOfSections(in tableView: UITableView) -> Int
- 기능: 테이블뷰의 섹션 수를 반환합니다. 기본적으로 1을 반환하지만, 여러 섹션을 사용할 수 있습니다.
- tableView(_:canEditRowAt:)
- 메서드 자료형: func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
- 기능: 특정 행이 편집 가능한지 여부를 반환합니다. 행 편집 기능을 활성화할 때 사용됩니다.
- tableView(_:commit:forRowAt:)
- 메서드 자료형: func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
- 기능: 사용자가 행을 편집할 때 호출됩니다. 삭제, 추가 등의 동작을 처리합니다.
Guard 문
- 도입: Swift 2에 도입된 구문
- 기능: 조건식이 거짓(false)일 경우 실행되는 else 절을 반드시 포함해야 함.
- else 절 내의 코드는 현재 코드 흐름을 빠져나갈 수 있는 구문(return, break, continue, throw 등)을 포함해야 하며, 다른 함수를 호출할 수도 있음.
기본 구조
guard <불리언 표현식> else {
// 거짓일 경우 실행될 코드
<코드 블록을 빠져 나갈 구문>
}
// 참일 경우 실행되는 코드는 이곳에 위치
- 조기 출구(early exit): 특정 조건에 맞지 않을 경우 현재의 함수나 반복문에서 빠져나가는 전략을 제공.
Guard~let 활용
- 사용 범위: return, break, continue, throw 등이 가능한 상황에서 사용 가능.
- 가독성: 옵셔널 바인딩을 통해 다중 if~else를 피하고, 코드 가독성을 높임.
- 함수 외부에서의 사용: guard let으로 언래핑된 변수는 guard 문 밖에서도 사용할 수 있음. 반면, if 문으로 언래핑된 변수는 그 안에서만 사용 가능.
guard~let의 활용
var x = 1
while true {
guard x < 5 else { break }
print(x)
x = x + 1
}
- 조건식이 거짓일 때: guard 문이 실행되어 else 블록의 코드가 수행되고, 지정된 제어문으로 빠져나감.
- 조건식이 참일 때: 이후 코드가 정상적으로 실행됨.
guard let~else로 옵셔널 바인딩
func multiplyByTen(value: Int?) {
guard let number = value else {//조건식이 거짓(nil)일 때 else 블록 실행
print("nil")
return
}
print(number*10) //조건식이 참일 때 실행, 주의 : number를 guard문 밖인 여기서도 사용 가능
}
multiplyByTen(value: 3) //30
multiplyByTen(value: nil)//nil
multiplyByTen(value: 10)//100
if~let vs. guard~let
func printName(firstName:String, lastName:String?){
// if let
if let lName = lastName { // lastName이 nil이 아니면
print(lName,firstName)
}
else{print("성이 없네요!")
}
// guard let
//guard let lName= lastName else { // lastName이 nil이면
//print("성이 없네요!")
//return // early exit
//}
//print(lName,firstName)
}
printName(firstName:"길동", lastName:"홍")//홍 길동
printName(firstName: "길동", lastName:nil)//성이 없네요!
디폴트 매개변수(아규먼트) 정의하기
func sayHello(count: Int, name: String = "길동") -> String {
return ("\(name), 너의 번호는 \(count)")
}
var message = sayHello(count: 10, name: "소프트")
// 결과: "소프트, 너의 번호는 10"
message = sayHello(count: 100)
print(message) // 결과: "길동, 너의 번호는 100"
함수로부터 여러 개의 결과 반환하기
func converter(length: Float) -> (yards: Float, centimeters: Float, meters: Float) {
let yards = length * 0.0277778
let centimeters = length * 2.54
let meters = length * 0.0254
return (yards, centimeters, meters)
}
var lengthTuple = converter(length:10)
print(lengthTuple) //(yards: 0.277778, centimeters: 25.4, meters: 0.254)
print(lengthTuple.yards) //0.277778
print(lengthTuple.centimeters) //25.4
print(lengthTuple.meters) //0.254
2개의 정수를 입력받아 가감제 리턴
import Foundation
func sss(x: Int, y: Int) -> (sum: Int, sub: Int, mul: Int, div: Double, mod: Int) {
let sum = x + y
let sub = x - y
let mul = x * y
let div = Double(x) / Double(y) // 같은 자료형만 연산 가능
let mod = x % y // 나머지 연산
return (sum, sub, mul, div, mod)
}
var result = sss(x: 10, y: 3)
print(result.sum) // 13
print(result.sub) // 7
print(result.mul) // 30
print(result.div) // 3.33333333333333
print(result.mod) // 1
// 소수점 3자리로 출력
String(format: "%.3f", result.div)////string은 구조체라서 import Foundation써야함
// 3.333
// 함수의 자료형 출력
print(type(of: sss)) // (Int, Int) -> (sum: Int, sub: Int, mul: Int, div: Double, mod: Int)
가변 매개변수(variadic parameter)
func displayStrings(strings: String...) //string... =>string이 몇개가 와도 관계가 없다
{
for string in strings {
print(string)
}
}
displayStrings(strings: "일", "이", "삼", "사")
displayStrings(strings: "one", "two")
displayStrings(strings: "one", "two","a","b","c")
과제 : 가변 매개변수(variadic parameter) 임의의 개수의 정수 값의 합을 출력하는 함수를 작성하여 호출
func add(numbers:Int...){
var sum:Int=0
for num in numbers{
sum += num
}
print(sum)
}
add(numbers:1,2,3) //6
add(numbers:2,2,2,2,2) //10
add(numbers:1,1,1,1,1,1,1,1,1,1) //10
add(numbers:1,1,1,1) //4
Swift 3에서는 inout의 위치가 바뀜( call by address하고 싶은 매개변수의 자료형 앞에 inout 씀)
var myValue = 10
func doubleValue (value: inout Int) -> Int {
value += value
return(value)
}
print(myValue)//10
print(doubleValue(value : &myValue)) //20
print(myValue)//20
Swift 문자열 서식(swift string format 자리수)
import Foundation
let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001) // kg/m*m
let shortenedBmi = String(format: "%.1f", bmi)
var body = ""
if bmi >= 40 {
body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
body = "정상"
} else {
body = "저체중"
}
print("BMI:\(shortenedBmi), 판정:\(body)")
함수 : 일급 객체 실습
// num에 1을 더하는 함수
func up(num: Int) -> Int {
return num + 1
}
// num에서 1을 빼는 함수
func down(num: Int) -> Int {
return num - 1
}
// up 함수를 toUp 변수에 할당
let toUp = up
// up 함수 호출
print(up(num: 10)) // 결과: 11
// toUp 변수 호출
print(toUp(10)) // 결과: 11
// down 함수를 toDown 변수에 할당
let toDown = down
// 함수 타입을 매개변수로 받아 결과를 출력하는 함수
func upDown(Fun: (Int) -> Int, value: Int) {
let result = Fun(value)
print("결과 = \(result)")
}
// toUp(10) 호출
upDown(Fun: toUp, value: 10) // 결과: 결과 = 11
// toDown(10) 호출
upDown(Fun: toDown, value: 10) // 결과: 결과 = 9
// Bool 값을 기반으로 함수를 결정하여 반환하는 함수
func decideFun(x: Bool) -> (Int) -> Int {
if x {
return toUp // true일 경우 toUp 반환
} else {
return toDown // false일 경우 toDown 반환
}
}
// decideFun 호출하여 true일 경우 toUp을 반환
let r = decideFun(x: true) // let r = toUp
print(type(of: r)) // 결과: (Int) -> Int
// r(10) 호출
print(r(10)) // 결과: 11 (toUp(10) 호출)
first class object : (1)함수를 변수에 저장 가능
// 인치를 피트로 변환하는 함수
func inchesToFeet(inches: Float) -> Float {
return inches * 0.0833333 // 1인치는 약 0.0833 피트
}
// inchesToFeet 함수를 toFeet 변수에 할당하여 함수처럼 사용
let toFeet = inchesToFeet
// toFeet 함수를 사용하여 인치 값을 피트로 변환
let result = toFeet(10) // 10 인치를 피트로 변환
print(result) // 결과 출력
클로저 표현식
// 두 정수를 더하는 함수
func add(x: Int, y: Int) -> Int {
return (x + y)
}
print(add(x: 10, y: 20)) // 결과: 30
print(type(of:add))
// 클로저 정의
let add1 = { (x: Int, y: Int) -> Int in
return (x + y) // 중괄호가 필요
}
print(add1(10, 20)) // 결과: 30
print(type(of:add1))
출처: 한성현 교수님 수업자료
'Swift' 카테고리의 다른 글
iOS 기초 프로그래밍 9주차 (0) | 2024.10.30 |
---|---|
iOS 프로그래밍 기초 7주차 (0) | 2024.10.16 |
iOS프로그래밍 기초 5주차 (0) | 2024.10.03 |
iOS프로그래밍 4주차 (0) | 2024.09.25 |
iOS프로그래밍 기초 2주차 (0) | 2024.09.11 |