Jihyeonnn
송지현
Jihyeonnn
전체 방문자
오늘
어제
  • Jihyeon Song (29)
    • C++ (0)
    • C (0)
    • Linux (0)
    • iOS (23)
    • JAVA (0)
    • Python (1)
    • GitHub (0)
    • 개인 프로젝트 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • iOS 개발
  • generic
  • 스위프트
  • swift
  • Mac사용법
  • 개발자
  • 코딩
  • Mac
  • IT
  • UI
  • array
  • optionalchaining
  • 프로그래밍
  • 파이썬 #python #개발 #기초
  • 개발
  • iOS개발
  • ios
  • 기초

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jihyeonnn

송지현

iOS

Swift - 5 Method(함수) 2

2024. 10. 15. 22:56

 

앞서 포스팅 했던 내용에 대해 다시 한 번 복습해 보겠다!

// 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
    'iOS' 카테고리의 다른 글
    • Swift 9 - 앱 개발하기
    • Swift 8 - 앱 개발과 Xcode 기초
    • Swift - 4 Method(함수)
    • Swift - 3 Optional
    Jihyeonnn
    Jihyeonnn

    티스토리툴바