애플 개발자 아카데미 어느덧 3달째,
다른 사람 속도 따라잡느라 대충대충했던 스위프트 문법을 다시 차근차근 공부해보자!
func printName(name: String){
print("name is \(name)")
}
printName(name: "Madeline")
//"name is Madeline"
parameter 를 호출하는 외부, 내부 관점에서 보았을 때, 이름을 다르게 하는 것이 더 자연스러울 때가 있다.
func printName(of name: String){
print("name is \(name)")
}
printName(of: "Madeline")
//"name is Madeline"
//외부 파라미터 생략 가능
//호출할 때 읽기 더 쉬움
func printName(_ name: String){
print("name is \(name)")
}
printName("Madeline")
//"name is Madeline"
func printName(of name: String){
print("name is (name)")
}
of : 외부에서 사용되는 이름
name : 내부에서 사용(호출할 때 x)
func makeDouble(num: Int) -> Int{
return num * 2
}
let result = makeDouble(3)
print(result)
//6
func discount(price: Double, ratio : Double = 0.2) -> Double{
return price(1-ratio)
}
let defaultRatioApplied = discount(price: 2000)
let customRatioApplied = discount(price : 2000, ratio: 0.5)
기본값 설정해놓고, 커스텀할 수도 있네~_~
func printNames(_ names: String...){
for name in names{
print("name is \(name)")
}
}
printNames("James", "Joy","Jake")
//name is James
//name is Joy
//name is Jake
enum DivideError : Error{
case cannotZero
}
func divide(dividend: Int, divisor : Int) throws -> Int{
if divisor == 0{
throw DivideError.cannotZero
}
return Int(dividend / divisor)
}
do{
let result = try divide(dividend : 50, divisor : 6)
//divisor를 0으로 설정하면 에러 감지
print(result
} catch {
print(error.localizedDescription)
}
예를 들어,
func divide(dividend: Int, divisor : Int) throws -> Int{
if divisor == 0{
throw DivideError.cannotZero
}
//dividend = 50
//=> error
return Int(dividend / divisor)
}
이 함수에서 dividend는 상수임.
-> 값을 변경할 수 없음
func makeTriple(num : inout Int){
num *= 3
//num에 새로운 값 할당!
}
var num = 8
makeTriple(num: &num)
print(num)
//24
{(parameter) -> return type in
statements
}
클로저 선언부 : 파라미터와 리턴타입을 명시해둔다.
클로저 실행부 : 실행 코드
let checking = {
print("checking"
}
checking()
let checking = { (id: String) in
print("checking \(id)"
}
checking("maddy")
//"checking maddy)"
let checking = { (id: String) -> Bool in
if id == "maddy"{
return true
}
return false
}
let isValid = checking("maddy")//true
func validate(id: String, checking: (String) -> Bool) -> Bool{
print("ready for validaiton")
let isValid = checking(id)
return isValid
}
let validationResult = validate(id:("maddy"), checking : checking)//true
let printHello = { () -> Void in
print("hello swift")
}
func doSomeClosure(_ action:() -> Void){
actoin()
}
doSomeClosure(printHello)
let validationResult3 = validate(id: "maddy", checking:{(id: String) -> Bool in
if id == "maddy"{
return true
}
return false
})
얘를 줄여보자
let validationResult3 = validate(id: "maddy", checking: { id in
if id == "maddy"{
return true
}
return false
})
1) 선언부
-> 코드 안에서 리턴값이 bool이니까, 리턴값은 없애도 됨!
시스템이 추론함
let validationResult3 = validate(id: "maddy", checking: { id in
let isValid = id == "maddy"
return isValid
})
2) 실행코드
id가 maddy 이면 true, 아니면 false!!
어렵다잉
3) id in 선언부를 없애도돼(파라미터를 $0로!), return도 생략 가능
let validationResult3 = validate(id: "maddy", checking: { $0 == "maddy"
})
요렇게 줄일 수 있다!
let validationResult3 = validate(id: "maddy" { $0 == "maddy"
})
이렇게도,,,