검색결과 리스트
전체 글에 해당되는 글 15건
- 2017.08.04 9. Swift 매개변수 1
- 2017.08.04 8. Swift 함수(Function)
- 2017.08.04 7. Swift 옵셔널 (Optional)
글
9. Swift 매개변수
Swfit
2017. 8. 4. 11:50
9. Swift 매개변수
- 내부 매개변수명, 외부 매개변수명
- 내부 매개변수 : 함수가 내부적으로 인자값을 참조하기 위해 사용하는 변수
- 외부 매개변수 : 함수 외부에서 함수나 인자값을 구분하기 위해 사용하는 변수
//내부 매개변수
func printHello(name : String, msg : String) {
print(“\(name)님, \(msg)”)
}
printHello(name:"홍길동" , msg:”안녕하세요")
//외부 매개변수
func printHello(to name : String,welcomeMessage msg : String) {
print(“\(name)님, \(msg)”)
}
printHello(to:"홍길동" , welcomeMessage:”안녕하세요")
- 가변 인자
//입력된 값들의 평균값을 계산하는 함수
func avg(score : Int… ) -> Double {
var total = 0 //정수 합계
for r in score { // 배열로 입력된 값들을 순회 탐색하면서 점수를 합산
total += r
}
return (Double(total) / Double(score.count)) //평균값을 구해서 반환
}
- In Out 매개변수
var cat = 30
func autoIncrement(value : Int) -> Int {
var value = value
value += 1
return value
}
print(autoIncrement(value:cnt)) // 함수 내부의 value 변수값 : 31
print(cat) // 외부에서 정의된 cnt 변수값 : 30
###################
//상수는 inout 매개변수에 인자 값으로 전달할 수 없음
let count1 = 30
autoIncrement(value:&count1)
//리터럴 inout 매개변수에 인자값으로 전달할 수 없음
autoIncrement(value:&30) // X
//변수는 inout 매개변수에 인자값으로 전달할 수 있음
var value = 30
autoIncrement(value:&value) // O : 31
'Swfit' 카테고리의 다른 글
11. Swift 함수의 중첩 (0) | 2017.08.04 |
---|---|
10. Swift 일급 객체로서의 함수 (0) | 2017.08.04 |
8. Swift 함수(Function) (0) | 2017.08.04 |
7. Swift 옵셔널 (Optional) (0) | 2017.08.04 |
6. Swift 튜플 (Tuple) (0) | 2017.08.04 |
글
8. Swift 함수(Function)
Swfit
2017. 8. 4. 11:49
8. Swift 함수(Function)
- 함수의 기본 개념
- 동일한 코드가 여러 곳에서 사용될 때 이를 함수화하면 재작성할 필요 없이 함수 호출만으로 처리할 수 있다.
- 전체 프로세스를 하나의 소스 코드에서 연속적으로 작성하는 것보다 기능 단위로 함수화하면 가독성이 좋아지고, 코드와 로직을 이해하기 쉽습니다.
- 비지니스 로직을 변경해야 할 때 함수 내부만 수정하면 되므로 유지보수가 용이하다.
- 사용자 정의 함수
func 함수 이름(매개변수1:타입, 매개변수2:타입 …) -> 반환타입 {
실행 내용
return 반환 값
}
- 함수 정의
//매개변수와 반환값이 모두 없는 함수
func printHello() {
print(“안녕하세요”)
}
###################
//매개변수가 없지만 반환값은 있는 함수
func sayHello() -> String {
let returnValue = “안녕하세요”
return returnValue
}
###################
//매개변수는 있으나 반환값이 없는 함수
func printHelloWithName(name : String) {
print(“\(name)님, 안녕하세요”)
}
###################
//매개변수와 반환값이 모두 있는 함수
func sayHelloWithName(name:String) -> String {
let returnValue = “\(name)님 , 안녕하세요”
return returnValue
}
###################
//반환값이 없는 함수일때도 return 사용하는 경우는 함수의 실행을 명시적으로 종료할 목적으로 사용 된다.
func hello(name: String?) {
guard let _name = name else{
return
}
print(“\(_name)님, 안녕하세요”)
}
- 함수의 호출
printHello()
//printHello = 함수이름
//() = 함수호출 연산자
//입력된 (값 x 횟수)만큼 카운트 변수의 값을 증가
func incrementBy(amount:Int, numberOfTimes:Int) {
var count = 0
count = amount * numberOfTimes
}
###################
func times(x:Int, y:Int) -> Int {
return (x*y)
}
times(x:5 , y: 10) // 함수의 이름만으로 호출한 구문
times(x:y:)(5, 10) // 함수의 식별자를 사용하여 호출한 구문
// 스위프트 함수를 호출하는 방법은 함수명 + 괄호 + 인자값 이므로, 인자 레이블까지를 전체 함수의 이름으로 본다면 항상 times(x:y:)(5, 10) 형식으로 호출하는 것이 맞다. 하지만 실제로는 times 만으로 함수를 호출할 수 있으므로 times 는 함수의 이름으로 , times(x:y:)는 함수의 식별자로 보는 것이 조금더 적절 하다.
- 함수의 반환값과 튜플
// Int,String 으로 구성된 튜플을 반환하는 함수
func getIndvInfo() -> (Int,String) {
let height = 180
let name = “꼼꼼한 재은씨”
return(height , name)
}
###################
// Int,Character,String 으로 구성된 튜플을 반환하는 함수
func getUserInfo() -> (Int,Character,String) {
//데이터 타입이 String 으로 추론되는 것을 방지하기 위해 타입 어노테이션 선언
let gender : Character = “M”
let height = 180
let name = “꼼꼼한 재은씨”
return (height, gender, name)
}
###################
//튜플을 반환하는 함수의 반환값을 대입 받은 변수나 상수는 튜플의 인덱스를 이용하여 튜플 내부의 요소를 사용할 수 있습니다.
var uInfo = getUserinfo()
uInfo.0 // 180
uInfo.1 // “M"
uInfo.2 // “꼼꼼한 재은씨”
###################
//인덱스를 사용하는 대신 가독성과 편리성을 위해 튜플 요소 각각을 변수로 직접 받을 수도 있다.
var (a,b,c) = getUserInfo()
a // 180
b // “M”
c // “꼼꼼한 재은씨"
###################
//일부 필요하지 않은 튜플 항목은 앞에서 배운대로 언더바를 이용하면 변수 할당 없이 건너뛸 수 있다.
var (height, _, name) = getUserInfo()
###################
//튜플 반환값을 정의하는 부분에 변수를 할당해 주었다. 기존에는 타입명만 작성되어 있던 부분이다.이렇게 튜플 인자 타입 앞에 각각의 변수를 붙여 주면 함수의 결과값을 받은 변수에도 이들이 자동으로 바인딩 된다.
func getUserInfo() -> (h:Int,g:Character,n:String) {
//데이터 타입이 String 으로 추론되는 것을 방지하기 위해 타입 어노테이션 선언
let gender : Character = “M”
let height = 180
let name = “꼼꼼한 재은씨”
return (height, gender, name)
}
- 타입얼라이어스
****************************************
* typealias <새로운 타입 이름> = <타입 표현> *
****************************************
typealias infoResult = (Int, Character, String)
func getUserInfo() -> infoResult {
let gender : Character = “M”
let height = 180
let name = “꼼꼼한 재은씨”
return (height, gender, name)
}
//설정 값
getUserInfo().0 // 180
getUserInfo().1 // “M”
getUserInfo().2 // “꼼꼼한 재은씨"
###################
let info = getUserInfo()
info.0 // 180
info.1 // “M”
info.2 // “꼼꼼한 재은씨"
'Swfit' 카테고리의 다른 글
10. Swift 일급 객체로서의 함수 (0) | 2017.08.04 |
---|---|
9. Swift 매개변수 (1) | 2017.08.04 |
7. Swift 옵셔널 (Optional) (0) | 2017.08.04 |
6. Swift 튜플 (Tuple) (0) | 2017.08.04 |
5. Swift 집합 (Sets) (0) | 2017.08.04 |
글
7. Swift 옵셔널 (Optional)
Swfit
2017. 8. 4. 11:47
7. Swift 옵셔널 (Optional)
- 옵셔널은 스위프트에서 도입된 새로운 개념 이다.
- 값을 처리하는 과정에서 오류가 발생할 가능성이 있는 값을 옵셔널 타입이라는 객체로 감싼 후 반환하는 개념. -> 옵셔널 래핑(optional wrapping) 이라고도 한다.
let num = Int(“1234”)
// Int 형으로 정상적으로 변환
// num 의 값은 Int 형 1234
###################
let num = Int(“abcd”)
// Int 형으로 변환 하려는 값이 “abcd” 문자열 이므로 변환 이 안됀다.
// num 의 값은 nil 이다.
*******************************
*일반 자료형은 nil 값을 가질 수 없다.*
*******************************
- 옵셔널 타입
var optInt : Int?
// 옵셔널 Int 타입
var optStr : String?
// 옵셔널 String 타입
var optDouble : Double?
// 옵셔널 Double 타입
var optArr : [String]?
// 옵셔널 Array 타입
var opDic : Dictionary<String, String>?
var opDic2 : [String:String]?
// 옵셔널 딕셔너리 타입
var optClass : AnyObject?
// 옵셔널 클래스 타입
- 옵셔널 강제 해제
var optInt : Int? = 3
print(“옵셔널 자체의 값 : \(optInt)”)
print(“!로 강제 해제한 값 : \(optInt!)”)
// 결과 값
옵셔널 자체의 값 : Optinal(3)
!로 강제해제한 값 : 3
###################
Int(“123”) + Int(“123”)
// 연산 불가능
Int(“123”)! + Int(“123”)!
// 연산 가능
// 출력값 = 246
Int(“123”)! + 27
// 연산 가능
// 출력값 = 150
- 옵셔널 바인딩
- 옵셔널 바인딩은 조건문 내에서 일반 상수에 옵셔널 값을 대입하는 방식으로 이루어진다.
- 반드시 조건문에서 사용해야만 하며, 상수에 옵셔널 값을 대입한 결과는 true/false 로 리턴 된다.
//조건문 내에서의 옵셔널 바인딩 처리
var str = “Swift"
if let intFromStr = Int(str) {
print(“값이 변환 되었습니다. 변환된 값은 \(intFromStr) 입니다.”)
}else{
print(“값 변환에 실패하였습니다”)
}
// 출력 : 값 변환에 실패하였습니다.
###################
// 가드문에서 변환된 값이 문자열 이면 값 변환 실패 , 인트형 이면 넘어감
func intStr(str:String) {
guard let intFromstr = Int(str) else {
print(“값 변환에 실패하였습니다.”)
return
}
print(“값이 변환 되었습니다. 변환된 값은 \(intFromStr) 입니다.”)
}
- 옵셔널 딕셔너리 선언
var capital = [“KR” : “Seoul”]
print(capital[“KR”])
print(capital[“KR”]!)
// 출력
Optional(“Seoul”)
Seoul
**********************************************************
* 옵셔널 타입에서 ! 연산자를 사용할 때는 반드시 nil 점검을 해주어야 한다.*
**********************************************************
- 컴파일러에 대한 옵셔널 자동 해제
*******************************
옵셔널 타입의 값을 사용하려면 항상 ! 연산자를 사용하여 옵셔널을 강제해제 하든가, 아니면 옵셔널 바인딩을 통해 일반 자료형으로 바꾸어 주어야 한다. 이렇게 해야 옵셔널 객체로 감싸진 값을 꺼낼수 있다, 하지만 명시적으로 강제 해제를 하지 않아도 컴파일러에서 자동으로 옵셔널을 해제하여 처리하는 경우가 있다.
*******************************
// 강제 해제 옵셔널 타입
let optInt = Int(“123”)
if ((optInt!) == 123) {
print(“opting == 123”)
} else {
print(“optInt != 123”)
}
// 강제 해제 하지 않은 옵셔널 타입
let optInt = Int(“123”)
if (optInt) == 123 {
print(“opting == 123”)
} else {
print(“optInt != 123”)
}
// 결과값 모두 : opting == 123
###################
let tempInt = Int(“123”)
tempInt == 123 // true
tempInt == Optional(123) // true
tempInt! == 123 // true
tempInt! == Optional(123) // true
- 옵셔널의 묵시적 해제
*******************************
옵셔널 타입을 해제하는 방법 중에는 묵시적 해제 라는 개념이 존재한다.
이것은 옵셔널이지만 값을 사용하려고 할 때에는 자동으로 옵셔널이 해제된 값을 제공하기 때문에 굳이 ! 연산자를 사용하여 해제할 필요가 없는 아주 편리한 구문이다.
컴파일러가 알아서 옵셔널을 해제해 준다는 점에서 자동 해제와 유사 하지만 , 컴파일러에 의한 자동 해제가 비교 연산이나 값의 할당 등 일부 구문에 한정되는 것과 달리 묵시적 해제는 옵셔널 변수를 사용하는 모든 경우에 적용할 수 있으며, 옵셔널 변수의 타입을 선언할 때 묵시적 해제를 미리 선언해 주어야 한다는 차이점이 있다.
옵셔널의 묵시적 해제 구문은 일반 옵셔널 타입의 변수 선언 구문과 매우 유사 하다 ? 연산자 대신 ! 연산자만 붙여준다.
*******************************
//명시적 옵셔널 선언
var str : String? = “Swift Optional”
print(str)
// 출력
Optional(“Swift Optional”)
###################
//묵시적 옵셔널 선언
var str : String! = “Swift Optional”
print(str)
// 출력
Swift Optional
###################
var value01 : Int? = 10
value01 + 5 // 오류
var value01 : Int! = 10
value01 + 5 // 15
'Swfit' 카테고리의 다른 글
9. Swift 매개변수 (1) | 2017.08.04 |
---|---|
8. Swift 함수(Function) (0) | 2017.08.04 |
6. Swift 튜플 (Tuple) (0) | 2017.08.04 |
5. Swift 집합 (Sets) (0) | 2017.08.04 |
4. Swift 배열 (Array) (0) | 2017.08.04 |