func printName(){
print("~")
}
printName()
func printMultiple(value:Int){
print("\(value)*10=\(value*10)")
}
printMultiple(value:5)
func printTotalPrice(price:Int, count:Int){
print("total price : \(price*count)")
}
printTotalPrice(price:1500, count:5)
func printTotalPrice(_ price : Int, _ count : Int){~}
printTotalPrice(1500, 5)
func printTotalPrice(가격 price : Int, 갯수 count : Int){~}
printTotalPrice(가격: 1500, 갯수: 5)
func print2(price:Int = 1500, count:Int){
print("TotalPrice : \(price*count)")
}
print2(count:5)
print2(price:2000, count:1)
func functionName(param: ParamType) -> ReturnType{
return returnValue
}
func totalPrice(price:Int, count:Int) -> Int {
let totalPrice = price*count
return totalPrice
}
let price = totalPrice(price:10000, count:7)
같은 함수 이름이지만 parameter, return type이 다르다
func printTotalPrice(price:Int, count:Int){
print("Total Price : ~")
}
func printTotalPrice(price:Double, count:Double){
print("Total Price : ~")
}
func printTotalPrice(가격:Double, 갯수:Double){
print("Total Price : ~")
}
파라미터는 기본적으로 복사되어 들어와 파라미터의 값을 수정하는 것이 불가능한데, Inout 이용시 파라미터의 값을 수정할 수 있다.
Function parameters are constants by default. Trying to change the value of a function parameter from within the body of that function results in a compile-time error. This means that you can’t change the value of a parameter by mistake. If you want a function to modify a parameter’s value, and you want those changes to persist after the function call has ended, define that parameter as an in-out parameter instead. - swift 공식 문서
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
예1)
func add(_ a:Int, _ b:Int) -> Int {
return a+b
}
func subtract(_ a:Int, _ b:Int) -> Int {
return a-b
}
var function = add
function(4, 2)
예2)
import UIKit
func add(_ a:Int, _ b:Int) -> Int {
return a+b
}
func subtract(_ a:Int, _ b:Int) -> Int {
return a-b
}
func printResult(_ function: (Int, Int)->Int, _ a:Int, _ b:Int){
let result = function(a, b)
print(result)
}
printResult(add, 10, 5)
printResult(subtract, 10, 5)
var name:String = "Shawn"
var catName:String = "meow"
var carName:String = ??
없는 것을 어떻게 표현할 것인가? → nil
optional에 값이 없는 경우 → nil로 표현
var carName:String? = "Mercedes"
또는
var carName:String?
carName=nil
print(carName)
let num = Int("10")
문자열을 Int로 casting시, 될 수도, 안 될 수도 있다. => num은 optional.
var carName:String?
carName="mercedes"
print(carName) // Optional("mercedes")로 출력 됨
print(carName!) // mercedes 출력
하지만
carName=nil
print(carName!) // 오류. 억지로 까려 하니
그래서 부드럽게 까려면
var carName:String?
carName="mercedes"
if let unwrap = carName { // optional에 value 값이 있는 경우 할당
print(unwrap)
} else {
print("no")
}
함수 안에서 활용한다면
func printParsed(from: String){
if let parsedInt = Int(from){
print(parsedInt)
} else{
print("Int로 컨버팅 안됨")
}
}
printParsed(from: "100")
printParsed(from: "100hello")
복잡해지면 Cyclomatic Complexity...
func printParsed(from: String){
guard let parsedInt = Int(from) else{
print("Int로 컨버팅 안됨")
return
}
print(parsedInt)
}
조금 더 간단하다.
nil일 경우 제시하는 명령을 수행하고 아니면 값 대입하기
The nil-coalescing operator (a ?? b) unwraps an optional a if it contains a value, or returns a default value b if a is nil.
let carName:String? // string optional
carName = nil
let myCarName:String = carName ?? "소나타" // 소나타 출력