1급 객체, 1급 시민
func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
func inchesToYards (inches: Float) -> Float {
return inches * 0.0277778
}
let toFeet = inchesToFeet //함수를 자료형처럼 사용하여 변수에 저장할 수 있다.
let toYards = inchesToYards
print(type(of:toFeet)) // (inches: Float) -> Float 부분 때문에 자료형은 Float
print(inchesToFeet(inches:10))
print(toFeet(10))
func outputConversion(converterFunc: (Float) -> Float, value: Float) {//함수를 매개변수로 전달 (Float) -> Float
let result = converterFunc(value) //toFeet(10)
print("Result = \(result)")
}
outputConversion(converterFunc:toFeet, value: 10) // 피트로 변환하는 inchesToFeet함수 호출
func decideFunction (feet: Bool) -> (Float) -> Float
{ //매개변수형 리턴형이 함수형 (리턴값으로 사용할 수 있다.)
if feet {
return toFeet //함수를 리턴
} else {
return toYards
}
}
//(Float) -> Float
//0.833333
//0.833333
//Result = 0.833333
🔳 1급 객체의 3가지 조건
◼ 함수를 자료형처럼 사용하여 변수에 저장할 수 있다.
◼ 매개변수로 전달할 수 있다.
◼ 리턴값으로 사용할 수 있다.
func me(age: Double) -> Double {
return age + 1.0
}
func you(age : Double) -> Double{
return age - 1.0
}
let toMe = me
print(me(age:23.0))
let toYou = you
print(you(age:23.0))
print(toMe(23.0))
print(toYou(23.0))
func youAndme(love: (Double) -> Double, value: Double) {
let result = love(value)
print("매개변수로 전달 : \(result)")
}
youAndme(love:toMe, value: 23.0)
youAndme(love:toYou, value: 23.0)
func lovelove(x: Bool) -> (Double) -> Double {
if x {
return toMe
} else {
return toYou
}
}
let h = lovelove(x:true)
print(type(of:h))
print(h(2999.0))
//24.0
//22.0
//24.0
//22.0
//매개변수로 전달 : 24.0
//매개변수로 전달 : 22.0
//(Double) -> Double
//3000.0
클로저(Closure)
func add(x: Int, y: Int) -> Int {
return(x+y)
}
print(add(x:10, y:20))
let add1 = { (x: Int, y: Int) -> Int in
return(x+y)
}
print(add1(10, 20)) //print(add1(x:10, y:20)) error
print(type(of:add1))
let Id = { (first: String , name: String) -> String in
return ("\(first), \(name)")
}
print(Id("안","동섭"))
//30
//30
//(Int, Int) -> Int
//안, 동섭
◼ 매개변수를 받거나, 값을 반환하도록 만들 수도 있음
func mul(val1: Int, val2: Int) -> Int
{
return val1 * val2
}
let result = mul(val1:10, val2:20)
print(result)
let multiply = {(val1: Int, val2: Int) -> Int in
//매개변수 리턴형
return val1 * val2
}// 여기서 multiply의 자료형은 (Int, Int) -> Int
let result1 = multiply(10, 20) //상수를 함수처럼 호출,200
print(result1)
//200
//200
◼ 두 개의 정수 매개변수를 받아서 정수 결과 값을 반환
let me = {(age: Double) -> Double in
return age + 1.0
}
var result = me(23)
print(result)
func meX(ageX: Double) -> Double {
return ageX + 1.0
}
print(meX(ageX:20))
let IdX = {(firstX: Int, nameX: Int) -> Int in
return firstX + nameX
}
var result2 = IdX(27, 40)
print(result2)
let IdY = {(firstX: Int, nameX: Int) -> Int in
return firstX + nameX
}
result2 = IdY(80, 80)
print(result2)
func Id(first: Int , name: Int, full: (Int, Int) -> Int) -> Int {
return full(first, name)
}
result2 = Id(first: 34, name: 21, full: IdX)
print(result2)
result2 = Id(first: 25, name: 12, full: IdY)
print(result2)
result2 = Id(first: 30 , name: 20, full: {(first: Int, name: Int) -> Int in
return first + name
})
print(result2)
//클로저 소스를 매개변수에 직접 작성
result2 = Id(first: 20 , name: 20) {(first: Int, name: Int) -> Int in
return first + name
}
print(result2)
◼ 마지막 매개변수 이름(full:)을 생략한 후 함수 소괄호 외부에 클로저를 구현
result2 = Id(first: 30 , name: 20, full: {(first: Int, name: Int) in
return first + name
})
print(result2)
//리턴형 생략
result2 = Id(first: 20 , name: 20) {(first: Int, name: Int) in
return first + name
}
print(result2) //trailing closure, 리턴형 생략
result2 = Id(first: 1, name: 2, full: {
return $0 + $1
})
print(result2)
//매개변수 생략하고 단축인자(shorthand argument name)사용
result2 = Id(first: 2, name: 3) {
return $0 + $1
} //trailing closure, 매개변수 생략하고 단축인자사용
print(result2)
result2 = Id(first: 3, name: 4, full: {
$0 + $1
})
print(result2)
//클로저에 리턴값이 있으면 마지막 줄을 리턴하므로 return생략
result2 = Id(first: 4, name: 5) {$0 + $1}
print(result2) //return 생략
클래스(class)
class Id {
var first : String = "안" // var 변수명: 자료형 = 초기값
var name : String = "동섭"
func display(){ //인스턴스 메서드
print("성=\(first), 이름=\(name)")
}
}
//var kim : Man = Man() // var 인스턴스명 : 클래스명 = 클래스명()
var kim = Id() // var 인스턴스명 = 클래스명()
print(kim.first) //인스턴스.프로퍼티
kim.display() // 인스턴스.인스턴스메서드 , 인스턴스 메서드는 인스턴스가 호출
//안
//성=안, 이름=동섭
◼ 인스턴스 만들고 메서드와 프로퍼티 접근
'iOS' 카테고리의 다른 글
Swift 문법 (extension / 접근 제어 / protocol / enum) (0) | 2021.10.19 |
---|---|
Swift 문법 (클래스/ 클래스 상속) (0) | 2021.10.12 |
Swift 문법 (guard / switch-case / 함수) (0) | 2021.09.28 |
옵셔널(optional) / 연산자(operator) / 제어문 (0) | 2021.09.21 |
Swift (0) | 2021.09.14 |