앞서 포스팅 했던 내용에 대해 다시 한 번 복습해 보겠다!
// ddd 함수
func ddd(x: Int) -> Int {
return x * 2
}
// setX 함수
func setX(x: Int) {
xx = x
}
// getX 함수
func getX(x: Int) -> Int {
return x
}
// add 함수
func add(x: Int, y: Int) -> Int {
return x + y
}
// setXY 함수
func setXY(x: Int, y: Int, newX xx: Int, newY yy: Int ) {
xx = x
yy = y
}
위는 함수의 선언 방법을 다양한 형태로 정리해 둔 소스이다.
옵셔널 바인딩(Optional Binding)의 예
var x : Int?
x = 10
if let xx = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
print(x,xx)
}
else {
print("nil")
}
var x1 : Int?
if let xx = x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
print(xx)
}
else {
print("nil")
}
//Optional(10) 10
//nil
옵셔널 타입 강제 언래핑 예시
if let constantname = optionalName{
//옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantname에 대입하고 if문 실행
//값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}
if var variablename = optionalName {
//옵셔널 변수가 값이 있다면 언래핑해서 일반 변수 variblename에 대입하고 if문 실행
//값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음
}
iOS 테이블뷰에서 많이 사용하는 메서드 표
메서드 이름 | 메서드 자료형 | 기능 설명 |
tableView(_:numberOfRowsInSection:) | Int | 지정된 섹션에 있는 행의 수를 반환합니다. |
tableView(_:cellForRowAt:) | UITableViewCell | 특정 행에 대한 셀을 반환합니다. |
tableView(_:titleForHeaderInSection:) | String? | 각 섹션의 헤더 제목을 반환합니다. |
tableView(_:heightForRowAt:) | CGFloat | 각 행의 높이를 반환합니다. |
tableView(_:didSelectRowAt:) | Void | 사용자가 특정 행을 선택했을 때 호출됩니다. 선택된 행에 대한 추가 작업을 수행합니다. |
tableView(_:willDisplay:forRowAt:) | 특정 행이 화면에 표시되기 직전에 호출됩니다. 셀의 스타일 변경이나 애니메이션을 추가할 수 있습니다. | |
tableView(_:moveRowAt:to:) | 사용자가 행을 이동할 때 호출됩니다. 데이터 소스에서 항목의 위치를 업데이트합니다. | |
tableView(_:commit:forRowAt:) | 사용자가 행을 편집할 때 수행되는 작업을 처리합니다. 일반적으로 삭제 작업을 수행합니다. | |
tableView(_:canMoveRowAt:) | Bool | 특정 행이 이동 가능할지를 반환합니다. |
tableView(_:canEditRowAt:) | 특정 행이 편집 가능할지를 반환합니다. |
guard문(조건식이 거짓이면 실행)
guard문은 Swift 2에 도입된 구문으로, 거짓(false)로 판단될 경우 수행될 else절을 반드시 포함해야 한다.
else 절에 속한 코드에는 현재의 코드 흐름을 빠져 나갈 수 있는 구문을 반드시 포함해야 한다.(early exit 전략 제공)
또는 다른 함수를 else 코드 블록 안에서 호출할 수 있다!
guard <boolean 표현식> else {
// 표현식이 거짓일 경우에 실행될 코드
<코드 블록을 빠져 나갈 구문>
}
// 표현식이 참일 경우에 실행되는 코드는 이곳에 위치
- while문에 if문 사용
var x = 1
while true {
if x > 4 { break } //참일 때 실행
print(x) //1 2 3 4
x = x + 1
}
- while문에 guard문 사용
var x = 1
while true {
guard x < 5 else { break } //거짓일 때 실행
print(x) //1 2 3 4
x = x + 1
}
guard let 활용하기
guard는 제어문 전환 키워드를 사용할 수 있는 상황이라면 사용이 가능하다.
함수 내부에 있다면 보통 return을 써서 해당 함수를 early exit 용도로 사용한다.
다중 if~else 대신 guard~let을 사용하면 다중 루프 없는 가동성 좋은 코드가 가능해서 많이 사용한다!\
- if ~ let 과 guard ~ let 비교
// if let
func printName(firstName:String, lastName:String?) {
if let lName = lastName { // lastName이 nil이 아니면
print(lName, firstName)
}
else {
print("성이 없네요!")
}
}
printName(firstName:"길동", lastName:"홍")
printName(firstName: "길동", lastName:nil)
//홍 길동
//성이 없네요!
//guard let
func printName(firstName:String, lastName:String?) {
guard let lName = lastName else { // lastName이 nil이면
print("성이 없네요!")
return // early exit
}
print(lName, firstName)
}
printName(firstName:"길동", lastName:"홍")
printName(firstName: "길동", lastName:nil)
//홍 길동
//성이 없네요!
guard let ~ else로 옵셔널 바인딩(Optional Binding)
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
기본 매개변수(Default Argument) 정의하기
func sayHello(count: Int, name: String = "길동") -> String {
return ("\(name), 너의 번호는 \(count)")
}
var message = sayHello(count:10, name: "소프트")
//소프트, 너의 번호는 10
func sayHello(count: Int, name: String = "길동") -> String {
return ("\(name), 너의 번호는 \(count)")
}
var message = sayHello(count:100) //이와 같이 name의 전달이 되지 않는 경우 기본값 사용
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.27778, centimeters: 25.4, meters: 0.254)
print(lengthTuple.yards) //0.277778
print(lengthTuple.centimeters) //25.4
print(lengthTuple.meters) //0.254
함수로부터 여러 개의 값들을 튜플로 감싸서 반환할 수 있다.
해당 소스는 인치 단위의 length를 매개변수로 받아 야드, 센티미터, 미터로 변환하고 이 세 개의 값을 반환한다.
import Foundation
func sss(x : Int, y : Int) -> (sum : Int, sub : Int, gop : Double, namuzi : Int, div : Double)
{
let sum = x+y
let sub = x-y
let gop = Double(x)*Double(y)
let namuzi = x%y
let div = Double(x)/Double(y) //같은 자료형만 연산 가능
return (sum, sub, gop, namuzi, div)
}
var result = sss(x:10,y:3)
print(result.sum) //13
print(result.sub) //7
print(String(format: "%.3f", result.gop)) //30.000
print(result.namuzi) //1
print(String(format: "%.3f", result.div)) //3.333
print(type(of:sss)) //(Int, Int) -> (sum: Int, sub: Int, gop: Double, namuzi: Int, div: Double)
- 가변 매개변수 예제
매개변수의 개수가 정확하지 않을 때 사용한다.
func displayStrings(strings: String...)
{
for string in strings {
print(string)
}
}
displayStrings(strings: "일", "이", "삼", "사") //일 이 삼 사
displayStrings(strings: "one", "two") //one two
func add(numbers:Int...) {
var sum:Int = 0
for num in numbers{
sum += num
}
print(sum)
}
add(numbers:1,2,3) //6
- inout 매개변수 예제
Swift의 기본으로, 함수가 값을 반환한 후에도 매개변수에 일어난 변화를 유지하려면 함수의 선언부에서 매개변수를 입출력 매개변수(inout parameter)로 선언해야 한다.
var myValue = 10
func doubleValue (value: inout Int) -> Int {
value += value
return(value)
}
print(myValue)//10
print(doubleValue(value : &myValue)) //20
print(myValue)//20
- 문자열 서식 예제
let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001) // kg/m*m
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:\(bmi), 판정:\(body)") //BMI:20.761245674640483, 판정:정상
위 소스는 문자열 서식을 사용하지 않은 경우이다. BMI 수치의 소수점이 매우 길다.
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)") //BMI:20.8, 판정:정상
하지만 문자열 서식을 사용하면 이와 같이 소수점이 정리되어 출력된다.
import Foundation
func calcBMI(weight: Double, height: Double) -> String {
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 = "저체중"
}
return "BMI:\(shortenedBmi), 판정:\(body)"}
print(calcBMI(weight:62.5, height: 172.3)) //BMI:21.1, 판정:정상
같은 결과를 리턴하는 다른 소스 예제이다. (함수 사용)
import Foundation
func calcBMI (weight : Double, height : Double) { //Void형
let bmi = weight / (height*height*0.0001) // kg/m*m
let shortenedBmi = String(format: "%.1f", bmi)
switch bmi {
case 0.0..<18.5:
print("BMI:\(shortenedBmi),판정:저체중")
case 18.5..<25.0 :
print("BMI:\(shortenedBmi),판정:정상")
case 25.0..<30.0 :
print("BMI:\(shortenedBmi),판정:1단계 비만")
case 30.0..<40.0 :
print("BMI:\(shortenedBmi),판정:2단계 비만")
default :
print("BMI:\(shortenedBmi),판정:3단계 비만")
}
}
calcBMI(weight:62.5, height: 172.3) //BMI:21.1,판정:정상
마지막에서 print() 함수를 사용하지 않아도 출력할 수 있게 만들었다.
import Foundation
func calcBMI(weight : Double, height : Double) -> String {
let bmi = weight / (height*height*0.0001) // kg/m*m
let shortenedBmi = String(format: "%.1f", bmi)
var body = ""
switch bmi {
case 0.0..<18.5:
body = "저체중"
case 18.5..<25.0:
body = "정상"
case 25.0..<30.0:
body = "1단계 비만"
case 30.0..<40.0 :
body = "2단계 비만"
default :
body = "3단계 비만"
}
return "BMI:\(shortenedBmi), 판정:\(body)"
}
print(calcBMI(weight:60.0, height: 170.0)) //BMI:20.8, 판정:정상
해당 소스는 switch ~ case문을 사용하였다.
모든 출처: Smile Han의 iOS 프로그래밍 기초
'iOS' 카테고리의 다른 글
Swift 9 - 앱 개발하기 (1) | 2024.11.06 |
---|---|
Swift 8 - 앱 개발과 Xcode 기초 (0) | 2024.10.30 |
Swift - 4 Method(함수) (1) | 2024.10.08 |
Swift - 3 Optional (0) | 2024.09.25 |
Swift - 2 연산자, 제어문 (2) | 2024.09.25 |