티스토리 뷰

Swift

Swift 5.0 Released!

Zedd0202 2019. 3. 26. 18:37
반응형


안녕하세요 :) Zedd입니다.

오늘!!! Swift 5가 릴리즈 되었습니당~~~~~다른때와 다르게 아주 역사적인 날로 느껴지네요. 

자고있는 사이 애플이 막 뭔가 발표를 좀 했던데....아케이드,.........

맥용 게임이라고 하니까 생각났는데..블리자드는 맥용 오버워치를 만들어라 맨날할게 그럼 진짜..

암튼 릴리즈노트에 몇개 추가된게 있어서..가 아니라 제가 안봤던거를 잠깐 같이 보려고해요.



Swift 5.0 Release ProcessSwift 5.0 변경사항에 뭐 거의 다 적긴했는데, 또 안본 내용들이 몇개 있어서 오늘은 그걸 같이 보려고 해요. 

오늘 swift.org에 올라온 Swift 5.0 Released도 봐주세욘



Xcode 10.2로 업데이트 하면, 바로..Swift 5.0을 쓸 수 있다는 사실!







음..(내가) 안본것들만 정리할게요.


가장 먼저 알아야 할 사실은 Xcode 10.2에서는 Swift 3모드가 제거되었어요. swift version 플래그에 지원되는 값은 4, 4.2, 5입니다 :D 아직까지 Swift 3을 쓰는 프로젝트는 마이그레이션을 각오하고 버전업을 해야겠죠? 


Result

Result 타입이 나왔다는 사실은 다들 알고계실텐데요. 

이 Result타입이(?) 음..이름이(?) 워낙 General하잖아요? 그래서 다른 모듈이나 코드에서 이 Result라는 타입을 구현했을 수 있어요.

근데!! 지금 Swift 5.0에서 Result타입이 나왔는데..그럼...그럼 내 모듈에있는 Result는 어떻게 되는거지? 


"your type now shadows the type from the standard library. "


예제로 봅시다. 



자, 모듈 Foo에 이렇게 Result타입이 있다고 생각해봅시다.



이렇게 import Foo를 하면, Result는 Foo꺼구나라고 인식합니다.

그럼 반대로 Foo가 import되어있지 않으면 Result타입은 standard library에 있는 Result로 인식하게 되겠죠..?

standard library에 있는 Result로 해주고싶다면, 명시적으로 앞에 Swift라고 붙혀주면 됩니다.



이렇게요.


자 다음!

Swift 5.0이전에는,



 이렇게 enum에...variadic arguments를 넣을 수 있었어요. (처음 안 사실.. 안될것도 없는데 굳이 하려고 시도 안해봤음...)

근데 이 동작이 의도적으로는 지원할 생각이 없는 동작(?)이라고 합니다.

그래서 Swift 5.0부터는 오류가 발생한다고 합니다!


그래서 이제 이렇게 명시적으로 [Int]..이렇게 해줘야 합니당 :D



Set, Dictionary

Swift 5.0이전까지는

 

서로 관련이 없는 Set이나 Dictionary에 같은 순서로 요소가 포함되어있다고 가정하는 기존 코드는 Swift 5.0에서 잘못된 결과를 더 자주 생성합니다.

잉..Set이나 Dictionary는 순서가 없느데 왜 같은 순서로 요소가 포함되어있다고 가정하는 코드를 왜.....

아무튼 Swift 5.0부터는, 새로 생성된 Set / Dictionary인스턴스마다 다른 hash seed를 사용한다고 해요. 결과적으로, 동등한 Set / Dictionary의 요소 순서는 이전 버전보다 훨씬 자주 다르게 됩니다.


~ 그러니까 순서가 같을수도 있고, 다를 수도 있는데, 그 다름의 빈도가 더 커졌다! 뭐 이런것 같네요.

아 난 또..

그러니까 우리 순서에만 집중합시다. 지금 위 그림을 보면 1, 2, 4, 3, 5로 순서가 동일하죠? (Swift 4.2버전임) 

Swift 5.0에서는 이러한 순서!가 더 달라질 확률이 높아집니다. 



이렇게요. 나는 a==b했을때 false가 나온다~ 뭐 그런건줄 알았는데, 그냥 순서 이야기였음. 지금 위 그림은 Swift 5.0인데, Swift 4.2버전과 다르게 순서가 다르죠? 

10.2 플레이그라운드로 오면서 뭔가 오른쪽 글자들의 색깔이 더 연해져따..


hash

Cocoa object의 일관성 없는 해싱을 방지하기 위해, NSObject의 hashValue프로퍼티는 더이상 override할 수 없습니다. 

hashValue의 override는 Swift 4.2에서 deprecated되었습니다. NSObject서브클래스에서 해싱을 사용자 정의 하라면, hash 프로퍼티를 override하세요. 


해싱과 동등(? equality)....은 같이 가야합니다. (Hashing and equality go hand in hand.) 만약 hash를 override했다면,  isEqual(_:)도 override해야하며, 반대의 경우도 마찬가지 입니다. 



ㄷ ㅏ음

Swift 5.0모드에서 Objective-C로 선언된 enum(열거형), 또는 시스템 프레임워크에서 가져온 enum타입의 전환은, 미래에 추가되거나 Objective-C구현 파일에서 개별적으로 정의될 수 있는 case를 처리해야합니다. 형식적으로 Objective-C는 기본 타입에 적합한 enum에 값을 저장 할 수 있습니다. 이러한 unknown cases는 새로운 @unknown default case를 사용하여 처리할 수 있습니다. 

누락된 경우, 경고가 표시됩니다. 


위에건 그냥 음..Objective-C를 많이 사용하시는 분들에게..알려드리고 싶어서 적어봤어요.








지금 Xcode 10.2로 업데이트하고 저희 프로젝트 업데이트 해보니까, 다행이 고칠건 별로 없네요. 에러 2개나옴!



(에러아이콘..뭔가 달라진 느낌인디)


Cannot override a Self return type with a non-Self return type에러가 뜨는데요. 


이게 몰까...왜ㅔ..갑자기..뜨는걸까..하고 문서를 살펴봤더니



요런 항목이 있네요!

살펴보면, 


"Swift 5.0모드에서 Self를 리턴하는 클래스 메소드는 더이상 final이 아닌 concrete class type을 리턴하는 메소드로 override할 수 없습니다. 이러한 코드는 타입이 안전하지 않으므로 업데이트 해야합니다."


자 일단 Swift 4.2버전을 볼게요.

에러를 잘보면 그냥 

어 니 리턴한다 했는데 리턴안했어~ 


근데...Swift 5.0에서는 



위와같은 에러가 뜨게 됩니다. 

자, class func과 final func의 차이..다들 아시다시피 override 가능여부 입니다. 

Base에서 factory라는 class메소드를 만들고, Derived라는 클래스에서 Base를 상속한 뒤 해당 클래스 메소드를 override했습니다. 그리고 자기자신인 Derived타입(concrete class type)을 리턴하도록 구현했습니다.


Cannot override a Self return type with a non-Self return type

non-Self리턴 타입으로 Self리턴타입을 override할 수 없습니다. 


Swift 5.0모드에서 Self를 리턴하는 클래스 메소드는 더이상 / final이 아닌 concrete class type을 리턴하는 메소드로 override할 수 없습니다. / 이러한 코드는 타입이 안전하지 않으므로 업데이트 해야합니다.


그러니까, 지금 Base의 factory메소드가 Self를 리턴하고 있잖아요. 근데 지금 Derived클래스에서는 factory를 override하고 concrete class type(= Derived)로 리턴하고 있죠? 암튼 이게 이제 안된다는거에요.

해결하려면, 위에 나와있듯이 "final이 아닌 concrete class type" 즉, Derived class를 final로 고쳐주면 될 것 같네요.



위 그림에서 Derived를 final로 바꿔준거 보이시죠? 그러니까 이제 너 리턴값 없어!!!~~!~! 라는 에러만 남게 됐네요. 


와웅...


그리고 가장 충격적인 사실 하나..



...........

음 ~~~~~~~~ 

ㅋㅋㅋ...음

ㅋㅋㅋㅋㅋㅋㅋㅋ음~~역시 애플~~!~!~



흔한 Swift 공식 문서_jpg

아무래도 Swift공식 document가 업데이트가 안된것 같은 느낌이네요. enum에 @unknown은 추가될만도 한데 아직 없음ㅎ


네 말그대로 unowned variable이 이제 Optional 타입을 "지원"합니다.


weak와 unowned의 차이점이라고 하면 보통 옵셔널이냐 아니냐로 부터 시작해서 어쩌고 저쩌고로 끝나곤 하는데, 이제 이런말 못하는건가?ㅋ_ㅋ..


자 보통, unowned를 옵셔널 타입으로 주게 되면 위와같은 에러가 나는데요, 다들 아시다시피 unowned는 optional을 지원하지 않아서 생기는 에러죠. 



Swift 5.0입니다 :D.....

응 nil이야~

위 코드는 그냥 컴파일이 된다!! nil이 된다! 만 보시면 됩니다. 


ㅎㅎ....음......

아! 만약에 지금 Xcode 10.2 && Swift 4.2여도 위 코드는 동작할겁니다.

엥?? 나 Xcode10.2이긴 한데..Swift 5.0아니고 ㅡㅡ Swift 4.2에서 빌드하는데 왜 컴파일 되고 빌드 되냐고 ㅡㅡ

왜냐면 이 feature는 Swift language에 대한 new feature가 아니라





Swift Compliler에 대한 New Feature입니다.

그래서 아마 Swift버전을 안탄다고 생각해요.


자, 그럼 또 하나 궁금증이 생기죠.

헐....나 [weak self]로 안하고 [unowned self]한거 있는데..그것도 그럼 self? < 로 해줘야해??....


는 아닙니다! 여전히 strong self로 캡쳐하더라구요.

이 내부동작은 똑같고, 그냥 선언할 때 optional type이 될 수 있다! 뭐 그런거 같아요.




아 근데 Xcode 10.2 빌드속도 왜이러지? 왤케느려 ㅡㅡ


자, 뭐 이정도가 제가 살펴본 내용인데,,뭐 어려운 쪽은 안본거고, 컴파일러 변경사항 뭐 패키지 매니저...이런거는 아직까지 잘 모르겠어요 ^_ㅠ 힝구..

아무튼 오늘은 여기까지!! 혹시나 틀린내용이 있다면 (특히 unowned관련..) 바로 댓글주시면 정말 감사할 것 같아요 :D 

오늘 글은 유난히 틀린 내용이 있을까봐 조마조마 한 것 같아요.. 특히..unowned...

왜 애플이 unowned가 optional을 지원하도록 만들었는지 토론해보는 것도 환영입니다 XD

이번 릴리즈노트의 자세한 사항들은 swift_5_release_notes_for_xcode_10_2를 참고해주세요. 

읽고 여러분들이 생각하는..여기 없는 특별한 변경사항들도 알려주시면 정말 감사하겠습니다 :D 


+ ) 

ㅋㅋㅋㅋㅋㅋㅋ

와우...ㅎ_ㅎ



반응형