Swift의 'open'키워드는 무엇입니까?


334

ObjectiveC.swift표준 라이브러리 의 파일에는 228 행 주위에 다음과 같은 몇 줄의 코드가 포함되어 있습니다.

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

open var이 문맥에서 무엇을 의미 open합니까 , 또는 일반적으로 키워드는 무엇 입니까?


2
아마도 관련 : stackoverflow.com/questions/24003918/… ( " open와 차이점은 무엇입니까 public?")
Ahmad F

참고 :“open”이라는 키워드는“확장을위한 개방형, 수정을 위해 폐쇄 된”개념에서 나왔습니다
Sazzad Hissain Khan

답변:


572

open Swift 3의 새로운 액세스 수준으로

2016 년 8 월 7 일부터 Swift 3 스냅 샷과 Xcode 8 베타 6에서 사용할 수 있습니다.

한마디로 :

  • open클래스는 접근subclassable 정의하는 모듈의 외부. open클래스 멤버는 접근재정의 정의하는 모듈의 외부.
  • public클래스는 접근 할 수 있지만 subclassable하지 정의하는 모듈의 외부. public클래스 멤버는 접근 할 수 있지만, 재정의하지 정의하는 모듈의 외부.

그래서 open무엇을 public이전 스위프트의 릴리스와의 접근에로 사용 public이 제한되고있다. 또는 Chris Lattner가 SE-0177에 다음과 같이 공개 액세스와 공개 재정의를 구분할 수 있습니다 .

"공개"는 이제 단순히 "공개보다 더 대중적"이며 매우 간단하고 깨끗한 모델을 제공합니다.

귀하의 예에서 open var hashValue액세스 가능하고 재정의 할 수있는 속성입니다NSObject 하위 클래스 .

더 많은 예와 세부 사항은 SE-0117을보십시오 .


16
그래서 public스위프트 3처럼 public final스위프트 2와 open같다 public?
Clashsoft

16
@Clashsoft : 스위프트 3 스위프트 (2)에는 해당이 없습니다에 스위프트 3 "열기"스위프트 2에서와 같은 "public"입니다 "공공"(마지막 클래스는 심지어 같은 모듈에 전혀 서브 클래스 할 수 없습니다.)
Martin R

59
그것은 유감스럽게 반 직관적입니다. 요약 해 주셔서 감사합니다.
GoldenJoe

7
@MikeS에 동의하면 이전 버전과의 호환성이 없기 때문에 이것이 끔찍한 혼란입니다.
HughHughTeotl

14
@ Mike Apple-불필요한 경우에도 다르게 생각하십시오.
Varun Nath

12

다음으로 읽기

다른 모듈에서 상속을 위해 개방

다른 모듈에서도 상속을 위해 개방을 반복합니다. 따라서 정의 모듈을 포함하는 다른 모듈에서 서브 클래 싱을 위해 공개 클래스가 열려 있습니다. 다른 모듈에서 열린 변수 및 함수가 열려 있습니다. 가장 제한적인 액세스 수준입니다. 공개 액세스는 공개 된 것이 다른 모듈에서 상속을 위해 닫히는 것을 승인하는 것만 큼 좋습니다.

에서 애플 문서 :

공개 액세스는 클래스 및 클래스 멤버에게만 적용되며 다음과 같이 공개 액세스와 다릅니다.

  1. 퍼블릭 액세스 또는 더 제한적인 액세스 레벨이있는 ​​클래스는 정의 된 모듈 내에서만 서브 클래 싱 할 수 있습니다.

  2. 퍼블릭 액세스 또는 더 제한적인 액세스 레벨을 가진 클래스 멤버는 정의 된 모듈 내에서만 서브 클래스로 대체 할 수 있습니다.

  3. 공개 클래스는 정의 된 모듈과 정의 된 모듈을 가져 오는 모듈 내에서 서브 클래 싱 될 수 있습니다.

  4. 공개 클래스 멤버는 자신이 정의 된 모듈 및 정의 된 모듈을 가져 오는 모듈 내의 서브 클래스로 대체 될 수 있습니다.

5

Open은 액세스 레벨이며 Swift에서 클래스 상속에 제한을 가하기 위해 도입되었습니다.

이는 공개 액세스 수준을 클래스와 클래스 멤버 에게만 적용 할 수 있음을 의미합니다 .

수업 중

공개 클래스는 정의 된 모듈과 클래스가 정의 된 모듈을 가져 오는 모듈에서 서브 클래 싱 될 수 있습니다.

반원들

반원들도 마찬가지입니다. 열린 메소드는 메소드가 정의 된 모듈과 메소드가 정의 된 모듈을 가져 오는 모듈의 서브 클래스에 의해 대체 될 수 있습니다.

이 업데이트의 필요성

일부 클래스의 라이브러리 및 프레임 워크는 서브 클래스로 설계되지 않았으므로 예기치 않은 동작이 발생할 수 있습니다. 네이티브 Apple 라이브러리는 동일한 메소드와 클래스를 재정의 할 수 없습니다.

따라서이 추가 후에는 공개 및 개인 액세스 수준을 적절하게 적용합니다.

자세한 내용은 액세스 제어에 관한 Apple 설명서 를 참조하십시오.


1

서브 클래스를 제외하고 open class func프로젝트의 어느 곳에서나 액세스 할 수 있습니다. 다음과 같이 Util 클래스에서 공개 클래스 함수를 정의한다고 가정하십시오.

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

그런 다음 뷰 컨트롤러의 어느 곳에서나 호출하여이 메소드에 액세스 할 수 있습니다

Utils.printHello()

3
이 답변은 공개를 통해 그렇게 할 수 있기 때문에 공개와 어떻게 다른지 설명하지 않습니다.
Jose Ramirez

그것에 대해 좀 더 설명이 필요
MD 빈 라덴 안사리

1

여러 모듈을 다룰 때 open이 시작됩니다.

개방 클래스는 정의 모듈 외부에서 액세스 가능하고 서브 클래스 가능합니다. 개방 클래스 멤버는 정의 모듈 외부에서 액세스하고 재정의 할 수 있습니다.


0

open은 다른 모듈에만 해당됩니다 : 코코아 포드 또는 단위 테스트, 상속 또는 무시 가능

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.