Swift
-
@discardableResultSwift 2020. 3. 18. 13:42
안녕하세요 :) 오늘은 @discardableResult 에 대해서 알아보겠습니다. 그냥 글자 그대로 보고 한번 유츄해볼까요? 버릴 수 있는 결 과....? 네 정답입니다. 말 그대로에요. Swift에서는 개발자를 위해 여러가지 warning들을 띄워줍니다. " 값이 변하지 않으면 var 대신 let을 사용하세요. " " 변수가 사용되지 않았으니 _ 를 사용하세요. " 등등... 마찬가지로! Result of call to ' ~~~~~ ' is unused 결과 값이 사용되지 않았습니다. 라는 워닝도 있습니다. 하지만 결과를 return 하는데 이 결과가 필요 없는 경우도 있겠죠. 이 때 warning 보기싫다? 그럴 때 사용하시면 됩니다. func log(_ msg: String) -> String ..
-
ARC(Autometic Reference Counting)Swift 2020. 2. 3. 17:38
- ARC(Autometic Reference Counting): Reference 개수를 세면서 자동으로 메모리를 관리해주는 방식입니다. - 참조하는 Reference 개수가 0이 되면 자동으로 힙 메모리에서 제거합니다. - 만약 서로 강하게 참조하고 있다면 reference 개수가 0이 될 수 없어 메모리 누수가 발생합니다. - 이를 방지하기 위한 방법으로 weak, unowned 가 있습니다. weak와 unowned는 reference count를 증가시키지 않고 참조하는 방식입니다. - 이미 메모리에 존재하지 않는 대상에 접근하려고 하면 런타임 에러가 발생합니다. 따라서 reference count를 증가시키지 않는 만큼 메모리에서 해제된 대상에 접근하지 않도록 주의해야 합니다. - weak는 ..
-
escaping closureSwift 2020. 1. 30. 16:20
개인적으로 공부하며 정리하는 블로그 입니다. 오류나 부족한 부분이 있을 수 있으니 감안하여 봐주시고 아낌없는 조언 감사드립니다 :D escaping Closure는 뜻 그대로 탈출 가능한 클로저 입니다. 함수가 실행된 이후에 실행되는 클로저 입니다. 비동기로 실행되거나 completionHandler 등이 escaping closure 입니다. escaping closure안에서는 self 를 명시적으로 사용해줘야 합니다. var completionHandlers: [() -> Void] = [] func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) { completionHandlers.append(completionH..
-
mutatingSwift 2019. 11. 19. 10:18
구조체를 정의할 때 메서드가 구조체 내부의 데이터를 수정할 때는 mutating 키워드를 선언 해주어야 한다. mutate란 사전적으로 변화시키다, 돌연변이 의 뜻을 갖는다. 뜻을 잘 생각하면 어떻게 쓰이는지 쉽게 이해할 수 있는데, 말 그대로 원래는 되지 않는 어떤 것을 되게 만드는, 돌연변이로 만드는 것이다. Swift에서 class 는 reference type 임에 반해 struct 와 enum 은 value type 이다. value type 일 때 자신의 인스턴스 메서드 안에서는 property를 수정할 수 없다. 이때 수정이 필요하다면 mutating 키워드를 사용해야 한다. struct Point { var x = 0.0, y = 0.0 // value type인 struct에서 // 자신..
-
inoutSwift 2019. 10. 24. 22:07
함수로 전달된 파라미터는 함수 내부에서 상수로 취급된다. 이때 파라미터의 값을 변경해주고 싶다면, inout 을 붙여준다. 이는 함수 내부에서 값이 변경될 것이라는 신호다. 바로 변수로서 값을 변경할 수 있고 외부 변수의 값도 바뀐다. 따라서 함수의 파라미터는 당연히 값이 변경될 수 있는 var로 선언된 변수여야하며, & 를 붙여서 레퍼런스를 넘겨준다. 예를들어 다음과 같이 사용한다, func doulbeInPlace(number: inout Int) { number *= 2 } var myNum = 10 doubleInPlace(number: &myNum) print(myNum) // 20
-
Variadic functions, 불특정 개수 파라미터Swift 2019. 10. 24. 21:36
variadic: 변종의, 독특한 일반 함수와는 조금 다른 함수란 뜻으로 파라미터의 개수를 여러 개 받을 수 있는 함수를 의미한다. Int... 와 같이 T... 의 형태로 사용한다. 실제로 print()는 대표적인 variadic 함수라 할 수 있는데, 다음과 같이 여러 파라미터를 출력할 수 있다. print("hello, ", "woongs") // hello, woongs 제곱을 출력해주는 square 함수를 variadic으로 만들 수도 있다. func square(numbers: Int...) { for number in numbers { print("squared \(number) is \(number * number)" } } square(numbers: 1, 2, 3, 4, 5)
-
Class vs Struct in SwiftSwift 2019. 10. 21. 17:01
공통점 properties와 methods를 정의할 수 있다. subscript를 정의할 수 있다. (subscript syntax를 사용할 수 있다.) init 함수를 통해 초기화 할 수 있다. extension을 사용할 수 있다. protocol로 적합하다. 차이점 class는 다른 class를 상속받을 수 있다. class는 deinitialized 할 수 있다. class는 reference type이고 struct는 value type이다. 특히 마지막 차이점이 중요한데, 이 차이가 우리가 둘 중 무엇을 사용할 지 결정적이기 때문이다. class와 struct의 가장 큰 차이는 struct는 value type, class는 reference type이라는 것이다. value type은 복사할 ..
-
KVO(Key-Value-Observing)Swift 2019. 9. 20. 17:49
객체의 어떤 값이 변경되었을 경우 이를 감지하기 위해 사용한다. KVO는 변수에 코드를 붙여 변수가 변경될 때마다 코드가 실행되도록 하는 방법이다. property observers(willset , didSet)과 아주 유사한데 KVO는 타입 정의 밖에서 observe를 추가한다는 점이 다르다. KVO는 순수 스위프트 코드로는 그리 좋지 않은데, Objective-c 런타임에 의존하고 있기 때문이다. 그래서 NSObject 를 상속받기 위해 @objc 를 반드시 붙여줘야 한다. 특히 KVO는 속성 각각에 @objc dynamic 을 붙여줘야 한다. dynamic 은 objective-c 의 문법의 하난데, 특정 method나 function의 구현을 objective-c 런타임에서 하겠다고 결정하는 것..