ObjectiveC.swift
표준 라이브러리 의 파일에는 228 행 주위에 다음과 같은 몇 줄의 코드가 포함되어 있습니다.
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
open var
이 문맥에서 무엇을 의미 open
합니까 , 또는 일반적으로 키워드는 무엇 입니까?
답변
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을보십시오 .
답변
다음으로 읽기
다른 모듈에서 상속을 위해 개방
다른 모듈에서도 상속을 위해 개방을 반복합니다. 따라서 정의 모듈을 포함하는 다른 모듈에서 서브 클래 싱을 위해 공개 클래스가 열려 있습니다. 다른 모듈에서 열린 변수 및 함수가 열려 있습니다. 가장 제한적인 액세스 수준입니다. 공개 액세스는 공개 된 것이 다른 모듈에서 상속을 위해 닫히는 것을 승인하는 것만 큼 좋습니다.
에서 애플 문서 :
공개 액세스는 클래스 및 클래스 멤버에게만 적용되며 다음과 같이 공개 액세스와 다릅니다.
퍼블릭 액세스 또는 더 제한적인 액세스 레벨이있는 클래스는 정의 된 모듈 내에서만 서브 클래 싱 할 수 있습니다.
퍼블릭 액세스 또는 더 제한적인 액세스 레벨을 가진 클래스 멤버는 정의 된 모듈 내에서만 서브 클래스로 대체 할 수 있습니다.
공개 클래스는 정의 된 모듈과 정의 된 모듈을 가져 오는 모듈 내에서 서브 클래 싱 될 수 있습니다.
- 공개 클래스 멤버는 자신이 정의 된 모듈 및 정의 된 모듈을 가져 오는 모듈 내의 서브 클래스로 대체 될 수 있습니다.
답변
Open은 액세스 레벨이며 Swift에서 클래스 상속에 제한을 가하기 위해 도입되었습니다.
이는 공개 액세스 수준을 클래스와 클래스 멤버 에게만 적용 할 수 있음을 의미합니다 .
수업 중
공개 클래스는 정의 된 모듈과 클래스가 정의 된 모듈을 가져 오는 모듈에서 서브 클래 싱 될 수 있습니다.
반원들
반원들도 마찬가지입니다. 열린 메소드는 메소드가 정의 된 모듈과 메소드가 정의 된 모듈을 가져 오는 모듈의 서브 클래스에 의해 대체 될 수 있습니다.
이 업데이트의 필요성
일부 클래스의 라이브러리 및 프레임 워크는 서브 클래스로 설계되지 않았으므로 예기치 않은 동작이 발생할 수 있습니다. 네이티브 Apple 라이브러리는 동일한 메소드와 클래스를 재정의 할 수 없습니다.
따라서이 추가 후에는 공개 및 개인 액세스 수준을 적절하게 적용합니다.
자세한 내용은 액세스 제어에 관한 Apple 설명서 를 참조하십시오.
답변
서브 클래스를 제외하고 open class func
프로젝트의 어느 곳에서나 액세스 할 수 있습니다. 다음과 같이 Util 클래스에서 공개 클래스 함수를 정의한다고 가정하십시오.
open class Utils: NSObject {
open class func printHello() {
print("Hello from utils")
}
}
그런 다음 뷰 컨트롤러의 어느 곳에서나 호출하여이 메소드에 액세스 할 수 있습니다
Utils.printHello()
답변
여러 모듈을 다룰 때 open이 시작됩니다.
개방 클래스는 정의 모듈 외부에서 액세스 가능하고 서브 클래스 가능합니다. 개방 클래스 멤버는 정의 모듈 외부에서 액세스하고 재정의 할 수 있습니다.
답변
open은 다른 모듈에만 해당됩니다 : 코코아 포드 또는 단위 테스트, 상속 또는 무시 가능