티스토리 뷰

반응형


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

이 글이 원래 제가 며칠전..에 쓴건데 제가 비공개로 해놨다가 다시 올리는겁니다. 참고 부탁드려요!


Swift 5.0...인지 Xcode 10.2인지부터...

아 지금보니까 Swift 버전은 안타는거 같네요. 

암튼 그럼 Swift 컴파일러가 변한것 같은데 

이런 warning이..많이 뜨지않나요



암튼 특히 라이브러리쪽에서 난리네야ㅕ

waring을 자세히 봅시다.



'public' modifier is redundant for instance method declared in a public extension

그냥 warning을 보면 알 수 있듯이;;

public이라는 접근 modifier가 redundant되었다~~라는 메세지네요.


흠........

일단 Access Control에 대한 이해를 가지고 있다는 전제로 글을 쓸게요.


Access Control (1)

Access Control (2)


자. 여러분 제가 여기서.....아 이거 잘못된 내용인가? 하고 허겁지겁 글을 비공개로 돌렸었는데요...

Access Control에 대한 이해가 다시 필요합니다...난 바보여..

일단 open, public, internal로 접근레벨이 명시된 타입의 구성원들의 기본 접근 레벨은 internal이란 사실! 

일단 이걸 알고 계셔야합니다. 





위 코드는 외부모듈에서 작성한 코드인데요, 

Zedd extension안에 들어있는  zeddInternalMethod의 접근 레벨은 뭘까요? 

Zedd가 선언시 public이니...internal접근레벨을 가지고 있을겁니다. 

왜냐면 위 코드는



얘랑 같죠?


네 아무튼 이까지는 아무 문제 ㄴㄴ

근데 


Zedd extension앞에 public이라고 명시해줘볼게요. 그럼 zeddPublicMethod의 접근레벨은 뭘까요? 

이름에...이미 나와있어서 바로 아셨겠지만 이제 public이 됩니다! 


그럼 즉 외부모듈에서 호출 할 수 있다는거네여ㅛ? 

응 호출 돼~ 


제가 이걸...이걸 몰랐습니다. 

아니 근데 왜이렇ㄱ세 헷갈리게....


access control에서 open, public, internal타입에 추가되는 멤버들의 기본 접근 레벨은 "internal"이잖아요?

근데 public extension을 하면 이제 거기에 추가되는 멤버들의 기본 접근 레벨은 public이 됩니다. 


그냥 정의가 그럼..


또는 extension을 명시적 접근 수준 수정자(ex. private extension)로 표시하여, extension 내에서 정의 된 모든 구성원에 대해 새 기본 접근 수준을 설정 할 수 있습니다. 이 새 기본값은 개별 타입 멤버의 extension내에서 여전히 무시될 수 있습니다. 


헷갈려..



위 코드는 

위 코드와 같은 기능을 합니다. 


일단 위 warning을 재현해볼게요.



그럼 위 문서의 내용에 따르면 


public class Zedd는 public클래스이지만 Zedd메소드 안에 들어갈 구성원(?)들은 기본적으로 internal이며

extension Zedd를 할 시 그 extension의 접근 레벨은 Zedd를 따라가므로 public일 것입니다.

하지만 안의 구성원들은 역시나 기본접근레벨이 internal입니다.


저 warning이 나는 이유는..뭔지 아시겠나요? 

public extension Zedd처럼, 명시적으로 extension앞에 접근 레벨을 명시해주면, 멤버들ㅇ의 접근레벨은 모두 해당 접근레벨이 된다고 위에서 그랬죠? 그래서 public extension Zedd를 하는 순간 zeddMethod는 "이미" public인 거에요. 근데 거기에 또!!! public을 했다고 warning을 주는 겁니다. 


extension앞의 public을 없애주고, 명시적으로 멤버앞에 public을 명시해주거나



extension시에 public을 명시하고 멤버들에는 명시 안해주거나

암튼 두가지 방법으로 warning을 없앨 수 있습니다.


저는 extension앞에 접근레벨을 명시하기보다는 멤버 앞에 명시적으로 일일이 접근레벨을 다는게 덜 헷갈릴 것 같아요. ㅎㅎ..






Xcode 10.1

에서는 warning 안나오는데 말이지..


이런걸 발견하면서..집에 있는 맥북은 한동안 Xcode 10.1로 둬야겠다는 생각을 하곤 합니다..

pod의 warning이 너무 거슬리면 warning을 끄는 옵션이 있으니 찾아보세요.


어제 warning안뜨는거 확인하고 글 쓰는건데..

원래 warning떴었는데 제 집 맥북이 너무 후져서 warning이 안뜬다거나...........그런거면 ㅈㅅ~!




반응형

'Swift' 카테고리의 다른 글

Swift 5.1 ) Ordered Collection Diffing  (1) 2019.07.06
Swift ) Swift 5.1 변경사항  (4) 2019.06.23
Swift 5.0 Released!  (2) 2019.03.26
Swift로 PS할 때 유용한 메소드들  (0) 2019.03.02
Swift 5 ) Flatten nested optionals resulting from 'try?'  (1) 2019.02.18