본문 바로가기
Swift/기초

31. 스위프트 기초 문법[계산기(10) - 함수 표기법, View Animation]

by UDDT 2025. 2. 6.

Swift/기초 카테고리에 업로드한 모든 내용은 KxCoding 기초 강의를 토대로 작성하였습니다.

 

 

⎮ Function Notation(함수 표기법) 문법 - Return Type이 없는 함수

  1. 기본 이해

func sayHello() {

}

 // 함수를 상수에 저장할 때는 sayHello() 이렇게 호출하는게 아니라 이름만 작성
let a = sayHello
// 여기서 sayHello가 Function Notation

 

  2. 컴파일러는 Type을 추론한다.          * 아래 코드에서 에러가 발생한 이유는, sayHello로 인식되는 method가 2개라서.

 

 

  3. 상수 a의 Type을 명시적으로 제시하면 에러가 사라짐.

let a: () -> () = sayHello

 

  4. 2번째 함수도 Type 지정을 지정하면, 다시 에러가 발생함.

 

  5. 함수에 파라미터가 있으면, Argument Label을 함께 써야함(이 때 Type은 생략)

func sayHello(with name: String) {

}

let b = sayHello(with:) 
// 여기서 sayHello(with:)가 Function Notation

 

  6. 만약 여기서 함수의 with를 와일드카드 패턴으로 생략한다면, 상수에 저장할 때도 _로 대체해야함.

func sayHello(_ name: String) {

}

let c = sayHello(_:)
// 여기서 sayHello(_:)가 Function Notation

 

  7. 함수를 호출할 때 Argument Label이 있는 것과 없는 것의 호출 방식이 다름.

sayHello(with: "Swift")       
sayHello("Swift")

/*
컴파일러가 명확히 구분이 가능하기 때문에
let a: () -> () = sayHello 처럼
Type을 명시적으로 선언하지 않아도 됨.
*/

 

⎮ Function Notation 문법 - Return Type이 있는 함수

func add(a: Int, b: Int) -> Int {
    return a + b
}

let d = add      // add 함수가 지금은 1개이기 때문에 컴파일러가 분석할 수 있음.
let d = add(a:b:)      // Argument Label을 포함하여 쓰는 것이 정식 문법

  * Function Notation에는 parameter Type과 return 값이 포함되지 않음.

let d = add(a:b:)
/*
이 코드만 봤을 때 
파라미터가 2개인 것은 알 수 있지만 
어떤 Type인지와 Return형의 유무는 알 수 없고,
따라서 함수의 선언을 확인해야 함.
*/

 

 모든 함수는 Function Notation으로 표기되어 있지만, Function Notation만으로 함수를 제대로 이해할 수는 없기 때문에
레퍼런스를 잘 확인해야 함.

 

⎮ 간단한 애니메이션 구현하기

  1. 새로운 프로젝트 생성 -MyFirstAnimation

 

  2. Library에서 UIView 추가

 

  3. Inspector에서 BackgroundColor 추가

 

  4. Size Inspector - 위치와 크기 조정(X: 0, Y: 0, Width: 100, Height: 100)

 

  5. 하단에 Filled Button 추가

 

  6. ViewController에서 UIView를 Outlet으로 연결

* 그림은 오타, boxView로 입력

 

  7. button은 action으로 연결

 

  8. 코드 추가

boxView.frame

/*
view의 위치와 크기를 묶어서 frame이라고 부름.
bowView.frame이라고 쓰면 view의 위치와 크기를 확인해줌.
*/

CGRect는 위치와 크기를 모두 저장하는 Type

 

  9. CGRect Type에 위치를 입력하면 위치 설정 가능, 크기를 입력하면 크기 설정 가능.

boxView.frame = CGRect(x: 200, y: 400, width: 100, height: 100)

 

  10. UIView에서 animate 메소드 찾기

 

 

  11. 코드 추가하고 기존 코드 위치 조정

 

  12. boxView.frame 앞에 self.을 붙여 컴파일 에러 해결

 

  13. 다음과 같이 수정

completion은 애니메이션 실행 후 실행되는 코드로, 불필요하면 생략해도 됨.

 

⎮ 크기와 Background 컬러 바꾸기

  1. 코드 수정

 

  2. 코드 추가

self.boxView.backgroundColor = UIColor.yellow

 

⎮ 문법 최적화 적용하기 - Swift 5.3ver 이상

  1. 정식 문법으로 코드 보기

UIView.animate(withDuration: 10, animations: { () -> () in
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: { (finised: Bool) -> Void in
	print("애니메이션 종료")
})

 

  2. 두번째 parameter에서의 가능한 문법 최적화는 () -> () 생략, in 키워드 생략

UIView.animate(withDuration: 10, animations: {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: { (finised: Bool) -> Void in
	print("애니메이션 종료")
})

 

  3. 세번째 parameter의 최적화를 위해 parameter Type과 return Type을 지운다.

UIView.animate(withDuration: 10, animations: {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: { (finised) in
	print("애니메이션 종료")
})

 

  4. swift 5.3부터는 마지막 parameter가 아니더라도 괄호 뒤로 뺄 수 있음.

UIView.animate(withDuration: 10, animations: ) {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
} { _ in
	print("애니메이션 종료")
}

 

  5. 여기서 ','와 animations는 생략 가능

UIView.animate(withDuration: 10) {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
} { _ in
	print("애니메이션 종료")
}

 

  6. 괄호 뒤에 있는 클로저(Trailing Closure)가 2개 이상이면, 첫번째 Trailing Closure는 괄호 뒤에 작성.

       2번째 클로저는 앞에 있는 클로저와 구분할 수 있게 블록 앞에서 ArgumentLabel을 명시적으로 작성해줘야함.

UIView.animate(withDuration: 10) {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
} completion: { _ in
	print("애니메이션 종료")
}

 

예시) Multiple Trailing closure

 

  위 코드에서 () -> Void에서 Return키를 누르면

 

단, parameter에 있는 코드가 closure가 아닐 때는 최신 문법 적용이 불가능하므로 inline closure에서 적용하는 문법 최적화를 해야함.

 

⎮ 문법 최적화 적용하기 - Swift 5.2ver 이하

  1. 정식 문법으로 코드 보기

UIView.animate(withDuration: 10, animations: { () -> () in
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: { (finised: Bool) -> Void in
	print("애니메이션 종료")
})

 

  2. 두번째 parameter에서의 가능한 문법 최적화는 () -> () 생략, in 키워드 생략

UIView.animate(withDuration: 10, animations: {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: { (finised: Bool) -> Void in
	print("애니메이션 종료")
})

 

  3. 세번째 parameter의 최적화를 위해 parameter Type과 return Type을 지운다.

UIView.animate(withDuration: 10, animations: {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: { (finised) in
	print("애니메이션 종료")
})

 

  4. parameter를 closure body에서 사용하지 않고 있기 때문에 _(wild card pattern)으로 생략.

UIView.animate(withDuration: 10, animations: {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: { _ in
	print("애니메이션 종료")
})

 

  5. 마지막 parameter이기 때문에 {}를 괄호 뒤로 뺄 수 있음.

UIView.animate(withDuration: 10, animations: {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}, completion: ) { _ in
	print("애니메이션 종료")
}

 

  6. 괄호에는 이미 parameter가 2개(withDuration, animations)가 남아 있으므로 괄호의 생략은 불가능.

      ','와 Argument Label만 생략

UIView.animate(withDuration: 10, animations: {
	self.boxView.frame = CGRect(x: 200, y: 400, width: 200, height: 200)
	self.boxView.backgroundColor = UIColor.yellow
}) { _ in
	print("애니메이션 종료")
}

 

최근댓글

최근글

skin by © 2024 ttuttak