swift & iOS/swift 49

[swift] 제네릭 generic <>

제네릭은 스위프트에만 있는 것은 아니다. c, c#, java 등 프로그래밍 언어 전반적으로 있는 기능이다. (타입스크립트에도 있음) 제네릭은 타입을 나중에 결정하도록 해준다. 나중에 언제 결정하냐면 인스턴스가 만들어질 때 parameter로 전달되는 타입으로 결졍된다. 그렇기 때문에 같은 알고리즘을 다양한 데이터 타입에 적용하려고 할 때 제네릭을 사용하면 좋다. 왜냐면 알고리즘의 내용은 똑같은데 Int 타입으로 하나, String 타입으로 하나, Double 타입으로 하나 이렇게 만드느니 제네릭을 사용하여 해당 알고리즘을 사용하려고 할 때 타입을 정하면 알고리즘을 타입 별로 여러 개 만들 필요없이 하나만 있어도 되기 때문이다. https://developer.apple.com/documentation/..

swift & iOS/swift 2022.01.28

[swift] error handling - throws 메소드 & do ... catch 문

아래 사용한 예제들은 모두 swift 공식문서 예제를 그대로 가져오거나 약간 활용한 것이다. 출처: https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html Error Handling — The Swift Programming Language (Swift 5.6) Error Handling Error handling is the process of responding to and recovering from error conditions in your program. Swift provides first-class support for throwing, catching, propagating, and manipulating recoverabl..

swift & iOS/swift 2022.01.28

[swift] 옵셔널 체이닝 optional chaining

옵셔널 체이닝은 옵셔널 타입의 프로퍼티, 메소드를 호출하는 과정(a process)이다. 중간에 nil이 한번이라도 발생하면 결과는 무조건 nil이다. 프로퍼티나 메소드 리턴값이 nil이어도 런타임 에러 같은 crash가 발생하지 않는다. 옵셔널 체이닝으로 받는 값은 nil아니면 옵셔널 타입이다. // 출처: https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html#ID246 class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 } let john = Person() let roomCount = john.residence!.numberOfRoo..

swift & iOS/swift 2022.01.28

[swift] 열거형 (enum with associated value)과 옵셔널 optional

출처: https://developer.apple.com/documentation/swift/optional Apple Developer Documentation developer.apple.com enum을 정해진 case 대로 쓸 때도 있지만 그 때 그 때 변하는 case를 가지는 enum도 있다. '관련값(associated)을 가지는 enum'이라고들 부르는 것 같다. 사실 Optional도 '관련 값을 가지는 enum'이다. 그래서 Optional 이라는 enum의 definition을 보면 아래처럼 associated value 를 가지는 enum이라는 것을 알 수 있다. case 밑에 init이랑 다른 메소드들도 있다. @frozen public enum Optional : Expressib..

swift & iOS/swift 2022.01.27

[swift] 함수에서 여러 개의 값을 반환하기 (튜플)

튜플 자료형을 사용하여 함수에서 여러 개의 값을 반환할 수 있다. 아래 함수는 배열에서 가장 작은 정수, 가장 큰 정수를 찾아 각각 min, max라는 이름이 붙여진 (min: 숫자, max: 숫자) 이렇게 생긴 튜플 자료형을 반환한다. // 출처: https://docs.swift.org/swift-book/LanguageGuide/Functions.html#ID164 func minMax(array: [Int]) -> (min: Int, max: Int) { var currentMin = array[0] var currentMax = array[0] for val in array[1.. currentMax { currentMax = val } } return (currentMin, currentMax..

swift & iOS/swift 2022.01.27

[swift] 문자열 끝에서 자르기 dropLast()

출처: https://developer.apple.com/documentation/swift/string/2893517-droplast Apple Developer Documentation developer.apple.com 문자열을 끝내서 잘라낸 후 남은 문자열만 취하고 싶으면 dropLast(:) 메소드를 사용하면 된다. let x = "10%" print(x.dropLast()) // "10" print(x.dropLast(1)) // "10" 위와 같음 print(x.dropLast(0)) // "10%" 끝에서 아무것도 잘라내지 않음 다만 잘라낸 후 반환하는 문자열의 타입은 String이 아닌 Substring이기 때문에 String이 필요하다면 타입을 바꿔줘야 한다. print(type(of:..

swift & iOS/swift 2022.01.23

[swift] 후행 클로저 (trailing closure)

https://what-whale-wants-to-say-is.tistory.com/70 [swift] 클로저 closure (feat. 함수) 스위프트의 함수는 '1급 객체'이다. 1급 객체의 특징은 다음과 같다. - 변수에 저장할 수 있음 - argument로 전달할 수 있음 - 리턴값으로 사용할 수 있음 제목은 클로저라고 써놓고는 왜 함수를 얘기 what-whale-wants-to-say-is.tistory.com 저번에 클로저에 대해 정리해서 포스팅한 적이 있는데 너무 길어져서 후행 클로저 부분을 마저 하지 못했다. 마저 해야지 어떡해 그럼...... 이번에도 공식문서를 알차게 참고하였다. 출처: https://docs.swift.org/swift-book/LanguageGuide/Closures..

swift & iOS/swift 2022.01.23

[swift] 열거형 enumeration 그리고 enum 배열처럼 사용하기

enumeration(줄여서 enum)은 특정 값들 중에서 하나만 선택되도록 하며 이 외에 원하지 않는 값이 선택되는 것을 방지한다. swift 공식문서에는 enumeration에 대해 이렇게 나와있다. (관련 있는 값들의 그룹에 대한 타입을 정의하여 그 타입에 맞는, 그 그룹에 속한 값들만 사용할 수 있게 해준다.) An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code. 출처: https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html 예를 ..

swift & iOS/swift 2022.01.22

[swift] failable initializer

클래스, 구조체, 열거형을 초기화 할 때 필요한 프로퍼티를 모두 제공하지 않거나 유효한 프로터피를 제공하지 않거나 아니면 다른 어떤 이유로 초기화가 실패할 수 있다. 그런 경우에 대비에 하나 이상의 failable initializer를 선언할 수 있다. init 뒤에 ? 만 붙이면 된다. 대신 아래처럼 parameter의 이름과 타입이 같은 init과 init? 을 동시에 선언할 수는 없다. // 아래처럼 init과 init?의 parameter의 타입과 이름이 똑같을 수 없음 class User { let age: Int let name: String init(age: Int, name: String) { // ... } init?(age: Int, name: String) { // ... } } 예..

swift & iOS/swift 2022.01.21