swift 기본문법 - 함수 고급

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.


매개변수 기본값

기본값을 갖는 매개변수는 매개변수 목록 중에 뒤쪽에 위치하는 것이 좋다.

func 함수이름(매개변수1 이름: 매개변수1 타입, 매개변수2 이름: 매개변수2 타입 = 매개변수 기본값 ...) -> 반환타입 {
  함수 구현부
  return 반환값
}

예시는 아래와 같다.

func greeting(friend: String, me: String = "zehye") {
  print("hello \(friend)! I'm \(me)")
}

// 뿐만 아니라 매개변수 기본값을 가지는 매개변수는 생략이 가능하고 수정도 가능하다.
greeting(friend: "hana")
greeting(friend: "John", me: "eric")

전달인자 레이블

전달인자 레이블은 함수를 호출할 때 매개변수의 역할을 좀 더 명확하게 하거나 함수 사용자의 입장에서 표현하고자 할 때 사용한다.

func 함수이름(전달인자 레이블 매개변수1 이름: 매개변수1 타입, 전달인자 레이블 매개변수2 이름: 매개변수2 타입 ...) -> 반환타입 {
  함수 구현부
  return 반환값
}

예시는 아래와 같다.

func greeting(to friend: String, from me: String) {
  print("Hello \(friend)! I'm \(me)")
}

위와 같이 함수의 중복 정의 또한 손쉽게 할 수 있다.
이미 greeting이라는 함수가 있었음에도 불구하고 to, from이라는 레이블을 이용해 함수 이름이 바뀐 효과를 갖는다.

함수의 외부에서는 to 라는 전달인자 레이블을 통해 함수를 호출하게 되고, 함수 내부에서는 friend 라는 매개변수 이름을 통해 매개변수를 사용하게 된다.
이렇듯 함수외부에서는 꼭 전달인자 레이블을 사용해야하며, 함수 내부에서는 매개변수 이름을 사용해주어야 한다.

greeting(to: "hana", from: "zehye")

가변 매개변수

매개변수를 통해 전달되어올 값들의 개수를 알기 어려울때 사용한다. 가변 매개변수는 함수당 하나만 가질 수 있다.

func 함수이름(매개변수1 이름: 매개변수1 타입, 전달인자 레이블 매개변수2 이름: 매개변수2 타입...) -> 반환타입 {
  함수 구현부
  return
}

예시는 아래와 같다.

func sayHelloToFriends(me: String, friends: String...) -> String {
  return ("Hello \(friends)! I'm \(me)")
}

이때 전달인자가 없거나 nil을 넣어주게 되면 오류가 발생한다.

print(sayHelloToFriends(me: "zehye", friend: ))
print(sayHelloToFriends(me: "zehye", friend: nil))

만약 가변 인자에 아무값도 넘겨주고 싶지 않다면 전달인자 레이블을 생략하면 된다.

print(sayHelloToFriends(me: "zehye"))

데이터 타입으로서의 함수

  • 스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임언어이다.
  • 스위프트의 함수는 일급객체이므로 변수, 상수 등에 저장이 가능하고 매개변수를 통해 전달 또한 가능하다.

그래서 스위프트의 함수는 하나의 데이터 타입으로서 표현이 될 수 있다.

(매개변수1 타입, 매개변수2 타입) -> 반환타입  // 반환타입은 생략 불가능
// 해당 변수에 함수가 들어올 것이라고 선언
var someFunction: (String, String) -> Void = greeting(to:from:)
someFunction("eric", "hana")

someFunction = greeting(friend:me:)
someFunction("eric", "hana")

// 타입이 다른 함수는 할당 불가능, 가변매개변수로 오는 함수
someFunction = sayHelloToFriends(me: friends:)

func runAnother(function: (String, String) -> Void) {
  function("jenny", "mike")
}

runAnother(function:greeting(friend:me:))
// 변수에 담겨있는 함수를 넘겨줄 수 있다
runAnother(function: someFunction)

swift 기본문법 - 함수 기본

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.


함수의 선언

함수의 기본 형태

func 함수이름(매개변수1 이름: 매개변수1 타입, 매개변수2 이름: 매개변수2 타입 ...) -> 반환타입 {
  함수 구현
  return 반환값
}

간단하게 구현해보면 아래와 같다.

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

함수의 반환값이 없는 경우

함수의 반환값이 없는 경우 void를 사용한다
void는 없다 라는 표현의 타입 별칭이다.

func 함수이름(매개변수1 이름: 매개변수1 타입, 매개변수2 이름: 매개변수2 타입 ...) -> Void {
  함수 구현
  return
}

예시는 아래와 같다.

func printMyName(name: String) -> Void {
  print(name)
}

혹은 void는 생략도 가능하다.

func 함수이름(매개변수1 이름: 매개변수1 타입, 매개변수2 이름: 매개변수2 타입 ...) {
  함수 구현
  return
}

예시는 아래와 같다.

func printMyName(name: String)  {
  print(name)
}

함수의 매개변수가 없는 경우

func 함수이름() -> 반환타입 {
  함수 구현부
  return 반환값
}
func maximumIntegerValue() -> Int {
  return Int.max
}

함수의 매개변수와 반환값이 없는 경우

func 함수이름() -> {
  함수 구현부
}

혹은

func 함수이름() {
  함수 구현부
}
funcA() { print("bye") }

함수의 호출

sum(a:3, b:5)
printMyName(name: "zehye")
maximumIntegerValue()

swift 기본문법 - 컬렉션 타입(Array, Dictionary, Set)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.


컬렉션 타입

여러 값들을 묶어 하나의 변수를 표현할 수 있도록 해준다.

Array

순서가 있는(인덱스가 있는) 리스트 컬렉션


var integers: Array<Int> = Array<Int>()  // []

integers.append(1)  // [1]
integers.appenr(100)  // [1,100]

integers.contains(100)  // true
integers.contains(99)  // false

// 0번 인덱스의 값을 삭제
integers.remove(at: 0)  // 1

// 마지막 인덱스 값을 삭제
integers.remove()  

// 모든 인덱스 값을 삭제
integers.removeAll()  

integers.count()

integers[0]

Array를 생성하는 다양한 방법

var doubles: Array<Double> = [Double]()

var strings: [String] = [String]()

var characters: [Character] = []

// let을 사용해 Array를 선언하면 불면 Array가 된다.
let immutableArray = [1,2,3]  

Dictionary

키와 값의 쌍으로 이루어진 컬렉션(key, value)

특별한 정렬 순서는 정해져있지 않다.

var anyDictionary: Dictionary<Stinrg: Any> = [String: Any]()

anyDictionary["someKey"] = "value"
anyDictionary["anotherKey"] = 100

// key에 해당하는 value를 삭제하고 싶을 때
anyDictionary.removeValue(forKey: "anotherKey")
anyDictionary["someKey"] = nil

// let으로 선언했기 때문에 Dictionary의 값을 변경할 수 없다
let emptyDictionary: [String: Stinrg] = [:]
let initalizedDictionary: [String: String] = ["name": "zehye", "gender": "female"]

Set

순서가 없고, 멤버가 유일한 컬렉션(중복된 값이 없다)

var integerSet: Set<Int> = Set<Int>()
integerSet.insert(1)
integerSet.insert(100)
integerSet.insert(99)
integerSet.insert(99)
integerSet.insert(99)

integerSet  // {100,99,1}

integerSet.contains(1)  // true
integerSet.contains(2)  // false

integerSet.remove(100)
integerSet.removeFirst()

integerSet.count  

let setA: Set<Int> = [1,2,3,4,5]
let setB: Set<Int> = [3,4,5,6,7]

// A와 B의 합집합
let union: Set<Int> = setA.union(setB)  // {2,4,5,6,1,3,7}

// 합집합을 정렬
let sortedUnion: [Int] = union.sorted()  // {1,2,3,4,5,6,7}

// 교집합
let intersection: Set<Int> = setA.intersection(setB)  // {5,3,4}

// 차집합
let subtracting: Set<Int> = setA.subtracting(setB)  // {2,1}

swift 기본문법 - Any, AnyObject, nil

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.


기본 데이터타입은 아니지만, 데이터 타입의 위치에서 편한 역할을 수행하는 Any, AnyObject, nil

Any

swift에서 모든 타입을 지칭하는 키워드
데이터 타입 위치에 들어올 수 있고, 모든 타입을 수용할 수 있다. 어떤 타입의 데이터도 다 들어오는 것이 가능하다.

var someAny: Any = 100
someAny = "어떤 타입도 수용 가능하다"
someAny = 123.12

let someDouble: Double = someAny

그러나 Any타입은 Double에 할당할 수 없다.

AnyObject

모든 클래스 타입을 지칭하는 프로토콜 > 클래스 인스턴스만을 취급

class SomeClass = {}
var someAnyObject: AnyObject = SomeClass()

nil

없음을 의미하는 키워드

어떤 데이터타입이든 들어올 수 있지만 nil은 들어갈 수 없다.
nil은 NULL과 유사한 표현으로 보면 된다.

nil이 필요한 순간은 옵셔널에서 볼 수 있다.

swift 기본문법 - 기본 데이터타입

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.


기본 데이터타입

Bool, Int, UInt, Float, Double, Character, String

Bool

var someBool: Bool = true

Int

64비트 정수형 타입 > 양수, 음수, 0 포함

var someInt: Int = 100

UInt

부호가 없는 정수 > 양의 정수

var someUInt: UInt = 100

Float

32비트 부동소수형 타입

var someFloat: Float = 3.14

Double

64비트 부동소수형 타입

var someDouble: Double = 3.14

Character

한글자 문자를 표현하기 위한 타입 > 유니코드를 사용

var someCharacter: Character = "👻"

String

var someString: String = "하하하 👻"
someString = someString + "웃으면 복이와요!!!"