티스토리 뷰

iOS/Swift-Documents

Swift 5.5 Functions -6

malrang-malrang 2022. 2. 4. 18:19

빵쟁이가 ios 개발자가 되기위해 정독하고자 작성한 글 입니다!
표현이 이상하거나 잘못번역된 부분이 있을수 있습니다.
혹 누군가 읽다 잘못된 부분이 있으면 댓글로 알려주세요!

Functions

함수는 특정 작업을 수행하는 코드 덩어리입니다.
함수가 하는 일을 이름과 함께 정의하고 이름을 호출 하여 사용합니다.

Swift의 통합 함수 구문은 매개변수 이름이 없는 간단한 C 스타일 함수에서 각 매개변수에 대한 이름과 인수 레이블이 있는 복잡한 Objective-C 스타일 메서드에 이르기까지 모든 것을 표현할 수 있을 만큼 충분히 유연합니다.
매개변수는 함수 호출을 단순화하기 위해 default 값을 줄 수도 있고 함수 실행이 완료되면 전달된 매개 변수를 수정 가능하게 하는 입력 매개 변수로 전달될 수도 있다.
Swift의 모든 함수는 함수의 매개변수 타입과 반환 타입으로 구성된다.
이를 사용하여 함수를 매개변수로 다른 함수에 전달하고 함수에서 함수를 반환 할수있다.
함수는 중첩된 함수 범위 내에서 유용한 기능을 캡슐화하기 위해 다른 함수 내에 작성할 수도 있습니다.

Defining and Calling Functions(함수의 정의와 호출)

함수를 정의할 때 매개변수(parameter)라고 하는 입력값의 타입을 하나이상 선언할수있다.
매개변수가 없어도 가능하다!
반환값(return) 의 타입도 선언할수있으며 매개변수와 같이 함수정의에 꼭 필요한건 아니다!
매개변수나 반환값이 필요할때 사용하면된다!

모든 함수는 이름 이름을 갖는다.
함수를 사용하려면 이름을 작성하고 함수를 매개변수를 사용해 정의 했다면 이름뒤()안에 타입에 맞는 매개변수를 입력해주면된다.
이때 매개변수에 들어갈 인수는 함수의 매개변수 선언 순서와 동일하게 작성해야한다!
Int, String 타입으로 선언했다면 1번엔 Int타입의 값이 두번째에는 String 타입의 값이 들어와야한다.

아래 예제의 함수는 사람의 이름을 매개변수로 받아 그 사람에 대한 인사말을 반환합니다.
이를 수행하기 위해 매개변수(Person이라는 String 값)와 해당 사람에 대한 인사말이 포함된 문자열의 반환 타입을 정의합니다.
함수를 호출하게되면 매개변수의 String 값이 greeting이 가지고있던 String 값과 더해져 반환되게 된다.

func greet(person: String) -> String {
    let greeting = "Hello, " + person + "!"
    return greeting
}

함수를 선언할 때는 제일 앞에 func를 써주면 된다.
함수 이름뒤에() 에 들어가는것이 매개변수 이고 -> 다음에는 반환값의 타입을 작성하면된다.

print(greet(person: "Anna"))
// Prints "Hello, Anna!"
print(greet(person: "Brian"))
// Prints "Hello, Brian!"

위의 예시는 입력 값이 "Anna"이고 입력 값이 "Brian"인 경우 어떻게 되는지 보여줍니다.
이 함수는 각각의 경우에 맞춤 인사말을 반환합니다.
greet(person: "Anna")와 같이 매개변수에 사람의 이름(String 값)을 전달하여 greet(person:) 함수를 호출합니다.
함수가 문자열 값을 반환하기 때문에 String 값을 갖고 있으며, greet(person:)은 print 함수에 감싸지게 되어 반환된 String값을 출력하게 됩니다.
함수가 갖고 있는 값을 출력한다 라고 이해!
greet 함수에 매개변수를 변경하여 여러번 호출해서 사용할수있다.

함수의 본문을 더 짧게 만들기 위해 메시지 생성과 return 문을 한 줄로 결합할 수 있습니다.

func greetAgain(person: String) -> String {
    return "Hello again, " + person + "!"
}
print(greetAgain(person: "Anna"))
// Prints "Hello again, Anna!"

Function Parameters and Return Values(함수의 매개변수, 반환값)

함수 매개변수와 반환 값은 Swift에서 매우 유연합니다.
매개변수가 없는것부터 다양한 매개변수가 있는 복잡한 함수까지 모두 정의할수 있습니다.

Functions Without Parameters

함수를 선언할 때 매개변수를 정의하지 않고 만들 수도 있다.
함수는 매개변수가 없더라도 이름 뒤에 괄호를 작성해야 합니다. 함수가 호출될 때도 함수 이름 뒤에도 빈 괄호 를 작성해야 합니다.

func sayHelloWorld() -> String {
    return "hello, world"
}
print(sayHelloWorld())
// Prints "hello, world"

Functions With Multiple Parameters(매개변수가 여러개인 함수)

함수는 괄호안에 쉼표로 구분하여 여러개의 매개변수를 가질수있습니다.
이 함수는 사람의 이름과 이미 인사를 받았는지 여부를 입력으로 받아 그 사람에 대한 적절한 인사말을 반환합니다.

func greet(person: String, alreadyGreeted: Bool) -> String {
    if alreadyGreeted {
        return greetAgain(person: person)
    } else {
        return greet(person: person)
    }
}
print(greet(person: "Tim", alreadyGreeted: true))
// Prints "Hello again, Tim!"

위의 코드에서 선언된 함수는 person, alreadyGreeted라는 이름의 매개변수를 가지는 함수이다.
여기서 중요한 것은 아까 선언한 greet(person:) 함수와 지금 선언한 greet(person:alreadyGreeted:) 함수는 다른 함수라는 것이다.
이름은 같지만 매개변수의 개수가 다르기 때문에 두 개의 함수는 다르다고 할 수 있다.

Functions Without Return Values(반환값이 없는 함수)

함수는 반환타입을 정의 하지 않아도된다.
예시는 String 값을 반환하는 대신 출력하는 버전의 Greet(person:) 입니다.

func greet(person: String) {
    print("Hello, \(person)!")
}
greet(person: "Dave")
// Prints "Hello, Dave!"

값을 반환할 필요가 없기 때문에 함수의 정의에는 반환 화살표(->) 또는 반환 타입이 포함되지 않습니다.

함수의 반환 값은 호출될 때 무시할 수 있습니다.

func printAndCount(string: String) -> Int {
    print(string)
    return string.count
}
func printWithoutCounting(string: String) {
    let _ = printAndCount(string: string)
}
printAndCount(string: "hello, world")
// prints "hello, world" and returns a value of 12
printWithoutCounting(string: "hello, world")
// prints "hello, world" but doesn't return a value

첫 번째 함수인 printAndCount(string:)는 문자열을 인쇄한 다음 문자 갯수를 Int로 반환합니다.
두 번째 함수인 printWithoutCounting(string:)은 첫 번째 함수를 호출하지만 반환 하지 않습니다.
두 번째 함수가 호출될 때 첫 번째 함수에 의해 출력 되지만 반환된 값은 사용되지 않습니다.

Functions with Multiple Return Values(반환값이 여러개인 함수)

튜플 유형을 함수의 반환 타입으로 사용하여 여러 값을 반환할 수 있습니다.

아래 예제는 int 값 배열에서 가장 작은 숫자와 가장 큰 숫자를 찾는 minMax(array:)라는 함수를 정의합니다.

func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

minMax(array:) 함수는 두 개의 Int 값을 포함하는 튜플을 반환합니다.
반환된 값에 접근하기 위해 반환값의 이름에 (.)점문법을 사용하여 접근하여 사용할수 있다.

let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// Prints "min is -6 and max is 109"

Optional Tuple Return Types

만약 함수에서 튜플이 반환되면 모든 튜플에 값이 없는 가능성이 존재한다.
반환 타입에 (Int, Int)?와 같이 물음표를 붙여줘서 값이 존재하지 않을 수도 있다고 알려줘야 한다.
여기서 (Int, Int)?는 (Int?, Int?)와는 다르다.

위의 minMax(array:) 함수는 두 개의 Int 값을 포함하는 튜플을 반환합니다.
그러나 함수는 전달된 배열에 대해 안전 검사를 수행하지 않습니다.
매개변수에 빈 배열을 넣은경우 위에서 정의한 minMax(array:) 함수는 array[0]에 액세스하려고 할 때 런타임 오류를 발생합니다.
빈 배열을 안전하게 처리하려면 선택적 튜플 반환 타입으로 minMax(array:) 함수를 작성하고 배열이 비어 있을 때 nil 값을 반환하도록 합니다.

func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

바인딩을 사용하여 이 버전의 minMax(array:) 함수가 실제 튜플 값을 반환하는지 아니면 nil을 반환하는지 확인할 수 있습니다.

if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}
// Prints "min is -6 and max is 109"

Functions With an Implicit Return(암시적 반환이 있는 함수)

만약 함수의 내용 전체의 길이가 한 줄이라면 그 줄이 return 값이 될 수 있다.

func greeting(for person: String) -> String {
    "Hello, " + person + "!"
}
print(greeting(for: "Dave"))
// Prints "Hello, Dave!"

func anotherGreeting(for person: String) -> String {
    return "Hello, " + person + "!"
}
print(anotherGreeting(for: "Dave"))
// Prints "Hello, Dave!"

위처럼 함수의 코드가 한 줄이라면 return을 생략하고 return 값을 정해줄 수 있다.

Function Argument Labels and Parameter Names

각 함수 매개변수에는 argument label(인수 레이블)과 parameter(매개변수) 이름이 있다.
Argument label(인수 레이블)은 함수가 호출될 때 각각의 매개변수들의 입력값을 정해줄 때 쓰인다.
매개변수 이름은 함수 구현에 사용됩니다. Argument label이 정의되지 않으면 매개변수 이름을 Argument label로 사용한다.
모든 매개 변수는 고유한 이름을 가져야 한다.
물론 모든 매개변수가 동일한 Argument label을 가질 순 있지만 읽기 어려운 코드가 될수 있으니 좋은 방법은 아니다.

func someFunction(firstParameterName: Int, secondParameterName: Int) {
    // In the function body, firstParameterName and secondParameterName
    // refer to the argument values for the first and second parameters.
}
someFunction(firstParameterName: 1, secondParameterName: 2)

위의 코드는 Argument label이 정의되지 않은 함수의 예를 나타낸 것이다.
Argument label은 정의되지 않았지만 실제 함수를 호출할 때 매개변수 이름을 Argument label로 사용하는 것을 볼 수 있다.

Specifying Argument Labels

공백으로 구분하여 매개변수 이름 앞에 인수 레이블을 작성합니다.

func someFunction(argumentLabel parameterName: Int) {
    // In the function body, parameterName refers to the argument value
    // for that parameter.
}

다음 예시는 사람의 이름과 고향의 매개변수를 가져와 인사말을 반환하는 greet(person:) 함수의 변형 버전 입니다.

func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill!  Glad you could visit from Cupertino."

person이라는 매개변수는 Argument Label이 없으므로 함수가 호출될 때 매개변수 이름인 person이 Argument Label처럼 쓰인다.
하지만 hometown이라는 매개변수는 from이라는 Argument Label이 존재한다.
그러므로 함수가 호출될 때 from으로 매개변수에 입력값을 주는 것을 볼 수 있다.
인수 레이블을 사용하면 함수를 문장과 같은 표현 방식으로 호출할 수 있으며 더욱 읽기쉽게 만들수 있다.

Omitting Argument Labels(인수 레이블 생략)

매개변수에 대한 인수 레이블을 원하지 않으면 해당 매개변수에 대한 명시적 인수 레이블 대신 밑줄(_)을 작성하십시오.
와일드 카드 라고도 하는거 같음!

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
    // In the function body, firstParameterName and secondParameterName
    // refer to the argument values for the first and second parameters.
}
someFunction(1, secondParameterName: 2)

Default Parameter Values(매개변수 기본값)

해당 매개변수의 타입 다음에 매개변수에 값을 할당하여 함수의 모든 매개변수에 대한 기본값을 정의할 수 있습니다.
기본값이 정의되어 있으면 함수를 호출할 때 해당 매개변수를 생략할 수 있습니다.

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
    // If you omit the second argument when calling this function, then
    // the value of parameterWithDefault is 12 inside the function body.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12

위의 코드에서 보듯 매개변수 선언 뒤에 = 12와 같이 값을 미리 정해줄 수 있는 것이다.
이렇게 하면 실제로 매개변수에 아무런 값이 입력되지 않으면 미리 정해둔 default value 값으로 함수를 실행할 수 있다.
기본값이 없는 매개변수는 기본값이 있는 매개변수보다 앞쪽에 배치해야 합니다.

Variadic Parameters(가변 매개변수)

Variadic 매개변수는 매개변수의 입력값에 0개부터 아주 많게도 넣을 수 있는 매개변수를 말한다.
매개변수의 타입 뒤에 ...를 붙여 Variadic 매개변수를 사용할 수 있다
이렇게 입력된 variadic 매개변수는 적절한 타입의 Array로 함수 내에서 사용된다.

아래 예시는 숫자 들을 매개변수로 받아 평균값을 구하는 함수이다.

func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8.25, 18.75)
// returns 10.0, which is the arithmetic mean of these three numbers

함수는 여러 가변 매개변수를 가질 수 있습니다. 가변 매개변수 다음에 오는 첫 번째 매개변수에는 인수 레이블이 있어야 합니다.
인수 레이블은 가변 매개변수에 전달되는 인수와 가변 매개변수 다음에 오는 매개변수에 전달되는 인수를 명확하게 합니다.

In-Out Parameters

함수 매개변수는 기본적으로 상수입니다. 해당 함수의 본문 내에서 함수 매개변수의 값을 변경하려고 하면 컴파일 시간 오류가 발생합니다. 이는 실수로 매개변수 값을 변경할 수 없음을 의미합니다.
함수의 매개변수값을 수정하거나 함수가 끝난후에도 매개변수 가 변경된 갓을 유지하려면 In-Out 매개변수로 정의 해야합니다.

매개변수 유형 바로 앞에 inout 키워드를 배치하여 in-out 매개변수를 작성합니다.
in-out 매개변수는 함수에 전달되고 함수에 의해 수정되며 원래 값을 대체하기 위해 함수 외부로 다시 전달되는 값이 있습니다.
in-out 매개변수의 동작원리는 상수 타입으로 매개변수를 받고 이 매개변수를 수정 가능하게 하기 위해 함수에서 다시 전달돼서 기존의 매개변수 값을 대체하게 된다.
In-Out 매개변수에는 입력값으로 변수만 올 수 있다. 즉 상수가 올 수 없다는 것이다.
in-out 매개변수를 호출해서 사용할 때는 변수의 이름 바로 앞에 &를 사용해 줘서 해당 변수가 함수 내에서 수정될 수 있다는 것을 알려줘야 한다.
이렇게 선언된 In-out 매개변수는 default 값과 variadic 매개변수를 사용할 수 없다.

Note
In-out 매개변수는 기본값을 가질 수 없으며 가변 매개변수는 inout으로 표시할 수 없습니다.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

swapTwoInts(::) 함수는 a의 값을 b로, b의 값을 a로 교환합니다.
이 함수는 a의 값을 temporaryA라는 임시 상수에 저장하고 b의 값을 a에 할당한 다음 임시 temporaryA를 b에 할당하여 이 교환을 수행합니다.

Int 유형의 두 변수를 사용하여 swapTwoInts(::) 함수를 호출하여 값을 바꿀 수 있습니다.
someInt 및 anotherInt 는 swapTwoInts(::) 함수의 매개변수로 사용될 때 앰퍼샌드가(&) 접두사로 붙습니다.

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"

위의 예는 someInt 및 anotherInt의 원래 값이 함수 외부에서 정의되었음에도 불구하고 swapTwoInts(::) 함수에 의해 수정되었음을 보여줍니다.

Note
인-아웃 매개변수는 함수에서 값을 반환하는 것과 다릅니다.
위의 swapTwoInts 예제는 반환 유형을 정의하거나 값을 반환하지 않지만 여전히 someInt 및 anotherInt의 값을 수정합니다.
인-아웃 매개변수는 함수가 함수 본문의 범위 외부에서 영향을 미치도록 하는 대체 방법입니다.

Function Types(함수 유형)

모든 함수는 함수 타입을 가지고 있다. 이는 매개변수의 타입과 반환값의 타입에 의해 결정된다.

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}

이 예에서는 addTwoInts 및multiplyTwoInts라는 두 개의 함수를 정의합니다.
이러한 함수는 각각 두 개의 Int 값을 매개변수로 받고 연산을 수행한 결과를 Int 값을 반환합니다.
이 두 함수의 타입은 (Int, Int) -> Int입니다.
이렇게도 읽을수 있습니다.
"Int 타입의 매개변수가 두 개 있고 Int 타입의 값을 반환하는 함수입니다."

다음은 매개변수나 반환값이 없는 함수의 또 다른 예입니다.

func printHelloWorld() {
    print("hello, world")
}

이 함수의 타입은 () -> Void 또는 "매개변수가 없고 Void를 반환하는 함수 입니다.

Using Function Types

함수 타입을 Swift의 다른 타입들처럼 사용할 수 있다.
예를 들어 상수나 변수의 타입을 함수 타입으로 만들고 여기에 함수를 저장할 수 있다.

var mathFunction: (Int, Int) -> Int = addTwoInts

이것은 다음과 같이 읽을 수 있습니다.
두 개의 Int 값을 매개변수로 받고 Int 값을 반환하는 함수 타입의 mathFunction이라는 변수를 정의합니다.
addTwoInts(::) 함수는 mathFunction 변수와 동일한 타입을 가지므로 이 할당이 가능합니다.

이제 MathFunction이라는 이름으로 할당된 함수를 호출할 수 있습니다.

print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"

다른 타입과 마찬가지로, 상수나 변수에 함수를 할당할 때 함수 타입을 유추하여 할당하는것도 가능하다!

let anotherMathFunction = addTwoInts
// anotherMathFunction is inferred to be of type (Int, Int) -> Int

타입 어노테이션을 하지않아도 타입 유추하여 anotherMathFunction 요녀석에게 addTwoInts 를 할당할려면
addTwoInts와 같은 (Int, Int) -> Int 타입 이겠군? 하고 유추하여 설정해준다!

Function Types as Parameter Types

함수 타입을 다른 함수의 매개변수로도 사용할 수 있다.

다음은 위에서 수학 함수의 결과를 출력하는 함수 입니다.

func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// Prints "Result: 8"

이 예제는 세 개의 매개변수가 있는 printMathResult(::_:)라는 함수를 정의합니다.
첫 번째 매개변수는 mathFunction이라고 하며 (Int, Int) -> Int 타입 입니다.
두번째, 세번째 매개변수는 mathFunction함수의 입력값으로 사용될 매개변수이다.

위의 코드에 선언된 printMathResult 함수는 a, b 값을 입력받아 mathFunction이라는 함수 타입의 매개변수의 입력값으로 사용해 더한값을 출력하는 기능을 가지게 된다.

Function Types as Return Types

함수 타입을 다른 함수의 반환 타입으로 사용할 수 있습니다.
반환하는 함수의 반환 화살표(->) 뒤에 완전한 함수 타입을 작성하여 이를 수행합니다.

다음 예제에서는 stepForward(:) 및 stepBackward(:)라는 두 개의 간단한 함수를 정의합니다.
stepForward(:) 함수는 입력 값보다 하나 더 큰 값을 반환하고 stepBackward(:) 함수는 입력 값보다 하나 작은 값을 반환합니다.
두 함수 모두 (Int) -> Int 타입을 갖습니다.

func stepForward(_ input: Int) -> Int {
    return input + 1
}
func stepBackward(_ input: Int) -> Int {
    return input - 1
}

다음은 반환 유형이 (Int) -> Int인 chooseStepFunction(backward:)이라는 함수입니다.
chooseStepFunction(backward:) 함수는 뒤로 호출되는 Bool 매개변수를 기반으로
stepForward(:) 함수 또는 stepBackward(:) 함수를 반환합니다.

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}

이제 chooseStepFunction(backward:)을 사용하여 stepForward 또는 stepBackward 를 실행하는 함수를 만들수 있습니다.

var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the stepBackward() function

위의 예는 currentValue 의 값이 0보다 큰지 작은지 검사합니다. currentValue의 값은 3이기때문에 currentValue > 0은 true를 반환하여 chooseStepFunction(backward:)이 stepBackward(_:) 함수를 반환하도록 합니다.
반환된 함수에 대한 참조는 moveNearerToZero라는 상수에 저장됩니다.

이제 moveNearerToZero에 함수가 할당 되었으므로 currentValue 의 값을 연산하여 0으로 변경하도록 사용할 수 있습니다.

print("Counting to zero:")
// Counting to zero:
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// zero!

Nested Functions

지금까지의 함수들은 전역 범위에서 정의된 함수들을 살펴봤다. 중첩 함수라고 하는 함수는 다른 함수 속에 함수를 정의하는 것이다. 중첩 함수는 정의된 함수 외부에서는 접근할 수 없다. Enclosing 함수는 중첩 함수를 가지고 있는 함수를 말한다. Enclosing 함수를 사용해서 중첩 함수 중 하나를 다른 범위에서도 사용할 수 있다.

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!

위의 코드를 중첩 함수를 활용한 버젼의 코드이다.

 

 

Swift 공식문서

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.6)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

개발자 pingu 님의 블로그를 참고하여 작성하였습니다!

https://icksw.tistory.com/

 

PinguiOS

iOS 개발자가 되기 위해 iOS 공부, Swift 공부, CS 공부를 하고 있습니다.

icksw.tistory.com

'iOS > Swift-Documents' 카테고리의 다른 글

Swift Generics  (0) 2022.07.24
Swift 5.5 Control Flow -5  (0) 2022.01.27
Swift 5.5 Collection Types -4  (0) 2022.01.27
Swift 5.5 Strings and Characters -3  (0) 2022.01.25
swift5.5 공식문서 Basic Operators -2  (0) 2022.01.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함