Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 테킷앱스쿨
- qaautomation
- Swift5
- robotframework
- 다트언어
- Flutter
- 다트기초문법
- 플러터
- Python
- SWIFT
- dartlang
- 야곰스위프트
- 스위프트프로그래밍
- 스위프트개발
- testautomation
- QA자동화
- playwright
- 티스토리챌린지
- 테스트오토메이션
- 다트기본문법
- 테스트자동화
- 파이썬자동화
- 다트
- 로봇프레임워크
- ios개발
- pythonautomation
- iOS프로그래밍
- 스위프트
- 오블완
- DART
Archives
- Today
- Total
day_by_day
7. 함수 본문
- 스위프트에서 함수는 일급 객체 : 하나의 값으로 사용할 수 있음
- 협업자끼리 코딩 규칙을 만들고 함수를 사용하는 것이 바람직
7.1 함수와 메서드
함수와 메서드는 기본적으로 같으며 어디서 사용되느냐에 따라 이름이 다를 뿐임
- 메서드 : 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용되는 함수
- 함수 : 모듈 전체에서 전역적으로 사용할 수 있는 함수
7.2 함수의 정의와 호출
재정의(오버라이드)와 중복 정의(오버로드) 모두 지원
7.2.1 기본적인 함수의 정의와 호출
- 기본 형태
func 함수 이름(매개변수...) -> 반환 타입 {
실행 구문
return 반환값
}
- 예제
func hello(name: String) -> String {
return "Hello \\(name)!"
}
let helloJenny: String = hello(name: "Jenny")
print(helloJenny)
func introduce(name: String) -> String {
"my name is + name"
}
let intro: String = introduce(name: "Jenny")
print(intro)
- return 생략 : 함수 내부의 코드가 단 한줄의 표현이고, 그 표현의 결과값의 타입이 함수의 반환 타입과 같을 경우 생략 가능
7.2.2 매개변수
- 매개변수와 전달인자 : introduce 예제에서 name은 매개변수, “Jenny”는 전달인자
매개변수가 없는 함수
func hello() -> String {
return "Hello, World"
}
print(hello())
매개변수가 여러개인 함수
func hello(name: String, yourname: String) -> String {
return " Hello \\(yourname), my name is \\(name) "
}
print(hello(name: "blair", yourname: "yagom"))
- 매개변수 이름 : name, yourname
매개변수 이름과 전달인자 레이블
- 함수 외부에서 매개변수의 역할을 좀 더 명확히 하기 위해 전달인자 레이블 지정
- 사용 형태
func 함수 이름(전달인자 레이블 매개변수 이름: 매개변수 타입, 전달인자 레이블 매개변수 이름: 매개변수 타입 ...) -> 반환 타입 {
실행 구문
return 반환값
}
- 예제
- 이때 함수 내부에서 전달인자 레이블을 사용할 수 없으며, 함수를 호출할때는 매개변수 이름을 사용할 수 없음
func sayHello(from myName:String, to name:String) -> String {
return "\\(name)! I'm \\(myName)"
}
print(sayHello(from: "yagom", to: "Jenny"))
- 와일드 카드 식별자 사용
- 전달인자 레이블을 사용하고 싶지 않을 때
func sayHello(_ name: String, _ times: Int) -> String {
var result: String = ""
for _ in 0..<times {
result += "Hello \\(name)"
}
return result
}
print(sayHello("heejin", 2))
- 전달인자 레이블이 달라지면 함수가 달라지는 것으로, 함수 오버로드(중복정의) 가능
func sayHello(to name: String, _ times: Int) -> String { .... }
func sayHello(to name: String, repeatCount time: Int) --> String {...}
//두개는 다른오버로드 된 다른 함수
매개변수 기본값
- 매개변수마다 기본갑슬 지정할 수 있으며, 매개변수가 전달되지 않으면 기본값을 사용
- 기본값이 있는 매개변수는 가장 뒤에 명시
- print 함수의 원형
- terminator 의 기본값은 \n
- separator 의 기본값은 공백, items 매개변수를 통해 들어온 값을 분리해서 표시해주는 문자열
public func print( _ items: Swift.Any..., separator: String = default, terminator: String = default)
가변 매개변수
- 매개변수로 몇개의 값이 들어올지 모를 때 가변 매개변수 사용
- 가변매개변수는 0개 이상의 값을 반아올 수 있음
- 함수마다 가변 매개변수는 하나만 가질 수 있음
func helloToFriends(me: String, friends names: String...) -> String {
var result: String = ""
for friend in names {
result += "hello \\(friends)"
}
result += " I\\'m" + me
return result
}
print(helloToFriends(me: "yagom", friends: "jay", "blair")
print(helloToFriends(me: "blair")
입출력 매개변수
- 함수의 전달인자로 값을 전달할 때는 보통 값을 복사해서 전달한다. 이때 값이 아닌 참조를 전달하려면 입출력 매개변수를 사용한다.
- 함수 외부의 값에 어떤 영향을 줄지 모르기 때문에 함수형 프로그래밍 패러다임에서는 지양
- 입출력 매개변수는 매개변수 기본값을 가질 수 없으며, 가변 매개변수로도 사용할 수 없음
var nums: [Int] = [1,2,3]
func nonRefer(_ arr: [Int]) {
var copyArr: [Int] = arr
copyArr[1] = 1
}
func refer(_ arr: inout [Int]) {
arr[1] = 1
}
nonRefer(nums)
print(nums[1]) // = 2
refer(nums)
print(nums[1]) // = 1
7.2.3 반환이 없는 함수
- 반환 값이 없는 함수는 반환 타입을 Void로 표기하거나 생략
func sayHello() { ...}
func sayHello(from name: String) { ... }
func saygoodbye() -> Void { ... }
7.2.4 함수의 데이터 타입
(매개변수 타입의 나열) -> 반환 타입
- 함수 타입의 사용 예시
typealias CalculateTwoInts = (Int, Int) -> Int
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
return a * b
}
var mathFunction: CalculateTwoInts = addTwoInts
print(mathFunction(2, 5))
mathFunction = multiplyTwoInts
print(mathFunction(2,5))
- 이밖에 전달인자로 함수를 전달할 수도 있음
func chooseMathFunction(_ toAdd: Bool) -> CalculateTwoInts {
return toAdd ? addTwoInts : multiplyTwoInts
}
- 전달인자 레이블과 함수의 타입
let someFunction: (lhs: Int, rhs: Int) -> Int //오류
let someFunction2: (_ lhs: Int, _ rhs: Int) -> Int // OK
let someFunction3: (Int, Int) -> Int // OK
7.3 중첩 함수
- 함수 안에 함수를 넣을 수 있다
typealias MoveFunc = (Int) -> Int
func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
func goRight(_ currentPosition: Int) -> Int {
return currentPosition + 1
}
}
7.4 비반환 함수(종료되지 않는 함수)
- 비반환 함수 안에서는 오류를 던지거나, 중대한 시스템 오류를 보고하는 등의 일을 하고 프로세스를 종료해 버린다.
- 어디서든 호출이 가능하며, guard 구문의 else 블록에서도 호출 할 수 있다.
- 비반환 함수의 반환 타입은 Never로 명시
func crashAndBurn() -> Never {
fatalError("Something very, very bad happend")
}
func someFunction(isAllIsWell: Bool) {
guard isAllIsWell else {
print("마을에 도둑이 들었습니다")
crashAndBurn()
}
print("All is Well")
}
someFunction(isAllIsWell: true)
someFunction(isAllIsWell: false) // 프로세스 종료 후 오류 보고
7.5 반환 값을 무시할 수 있는 함수
의도적으로 함수의 반환 값을 사용하지 않을 경우 반환값을 무시해도 된다는 @discardableResult 를 함수 func 키워드 앞에 선언
'QA Automation > swift5' 카테고리의 다른 글
9. 구조체와 클래스 (0) | 2023.06.21 |
---|---|
8. 옵셔널(Optional) (0) | 2023.06.20 |
6. 흐름제어 (0) | 2023.06.20 |
5. 연산자 (0) | 2023.06.20 |
4. 데이터 타입 고급 (0) | 2023.06.20 |