Swift에 액세스 수식어가 있습니까?
Objective-C 는 Objective-C 데이터일 수 .public
,protected
또는private
예:
@interface Foo : NSObject
{
@public
int x;
@protected:
int y;
@private:
int z;
}
-(int) apple;
-(int) pear;
-(int) banana;
@end
Swift 참조에서 액세스 수식자에 대한 언급을 찾지 못했습니다.스위프트에서 데이터의 가시성을 제한할 수 있습니까?
Swift 3.0.1 기준으로 가장 높은 수준(최소한의 제한)에서 가장 낮은 수준(가장 제한적인 수준)까지 아래에 설명된 4가지 수준의 액세스가 있습니다.
1. open
그리고.public
정의 모듈(대상) 외부에서 엔티티를 사용할 수 있도록 설정합니다.일반적으로 사용하는 항목open
또는public
프레임워크에 대한 공용 인터페이스를 지정할 때 액세스할 수 있습니다.
그러나 접근 권한은 클래스 및 클래스 구성원에만 적용되며, 다음과 다릅니다.public
다음과 같이 액세스합니다.
public
클래스 및 클래스 멤버는 정의 모듈(대상) 내에서만 하위 분류 및 재정의할 수 있습니다.open
클래스 및 클래스 멤버는 정의 모듈(대상) 내부 및 외부 모두에서 하위 분류 및 재정의할 수 있습니다.
// First.framework – A.swift
open class A {}
// First.framework – B.swift
public class B: A {} // ok
// Second.framework – C.swift
import First
internal class C: A {} // ok
// Second.framework – D.swift
import First
internal class D: B {} // error: B cannot be subclassed
2. internal
정의 모듈(대상) 내에서 엔티티를 사용할 수 있도록 합니다.일반적으로 사용하는 항목internal
앱 또는 프레임워크의 내부 구조를 정의할 때 액세스할 수 있습니다.
// First.framework – A.swift
internal struct A {}
// First.framework – B.swift
A() // ok
// Second.framework – C.swift
import First
A() // error: A is unavailable
3. fileprivate
엔티티의 사용을 정의 소스 파일로 제한합니다.일반적으로 사용하는 항목fileprivate
액세스 권한을 사용하여 특정 기능의 구현 세부 정보를 숨길 수 있습니다.
// First.framework – A.swift
internal struct A {
fileprivate static let x: Int
}
A.x // ok
// First.framework – B.swift
A.x // error: x is not available
4. private
엔터티의 사용을 엔클로저 선언으로 제한합니다.일반적으로 사용하는 항목private
특정 기능의 구현 세부 정보가 단일 선언 내에서만 사용되는 경우 해당 세부 정보를 숨기기 위한 액세스 권한입니다.
// First.framework – A.swift
internal struct A {
private static let x: Int
internal static func doSomethingWithX() {
x // ok
}
}
A.x // error: x is unavailable
스위프트 4 / 스위프트 5
Swift 문서 - 액세스 제어에 언급된 바와 같이 Swift에는 다음과 같은 5가지 액세스 제어가 있습니다.
오픈 및 퍼블릭: 모듈의 엔티티와 정의 모듈을 가져오는 모든 모듈의 엔티티에서 액세스할 수 있습니다.
internal: 모듈의 엔티티에서만 액세스할 수 있습니다.기본 액세스 단계입니다.
파일 비공개 및 비공개: 사용자가 정의하는 제한된 범위 내에서만 제한적으로 액세스할 수 있습니다.
공개와 공개의 차이점은 무엇입니까?
open은 Swift의 이전 버전의 public과 동일하며 다른 모듈의 클래스가 이를 사용하고 상속할 수 있습니다. 즉, 다른 모듈에서 하위 분류할 수 있습니다.또한 다른 모듈의 구성원이 사용하고 재정의할 수 있습니다.같은 논리가 그들의 모듈에도 적용됩니다.
public은 다른 모듈의 클래스가 사용할 수 있도록 허용하지만 상속할 수는 없습니다. 즉, 다른 모듈의 클래스는 하위 분류할 수 없습니다.또한 다른 모듈의 구성원이 사용할 수 있지만 재정의할 수는 없습니다.모듈에 대해서는 동일한 개방형 논리를 가지고 있습니다(클래스가 모듈을 사용하고 상속할 수 있도록 허용).구성원이 사용하고 재정의할 수 있습니다.
파일 개인 정보와 개인 정보의 차이점은 무엇입니까?
fileprivate는 전체 파일에서 액세스할 수 있습니다.
private는 단일 선언 및 동일한 파일에 있는 선언의 확장자에서만 액세스할 수 있습니다. 예:
// Declaring "A" class that has the two types of "private" and "fileprivate":
class A {
private var aPrivate: String?
fileprivate var aFileprivate: String?
func accessMySelf() {
// this works fine
self.aPrivate = ""
self.aFileprivate = ""
}
}
// Declaring "B" for checking the abiltiy of accessing "A" class:
class B {
func accessA() {
// create an instance of "A" class
let aObject = A()
// Error! this is NOT accessable...
aObject.aPrivate = "I CANNOT set a value for it!"
// this works fine
aObject.aFileprivate = "I CAN set a value for it!"
}
}
Swift 3과 Swift 4 Access Control의 차이점은 무엇입니까?
SE-0169 제안에서 언급한 것처럼 Swift 4에 추가된 유일한 개선 사항은 개인 액세스 제어 범위가 동일한 파일의 해당 선언 확장자에서 액세스할 수 있도록 확장되었다는 것입니다. 예를 들어, 다음과 같습니다.
struct MyStruct {
private let myMessage = "Hello World"
}
extension MyStruct {
func printMyMessage() {
print(myMessage)
// In Swift 3, you will get a compile time error:
// error: 'myMessage' is inaccessible due to 'private' protection level
// In Swift 4 it should works fine!
}
}
그러니 신고할 필요가 없습니다.myMessage
전체 파일에서 액세스할 수 있도록 파일 개인 정보로 지정합니다.
Swift 또는 ObjC(또는 Ruby 또는 Java 등)에서 "개인적인 방법"을 만드는 것에 대해 이야기할 때 이러한 방법은 실제로 개인적인 것이 아닙니다.그들 주변에는 실제적인 접근 통제 장치가 없습니다.조금이라도 자기 성찰을 제공하는 언어는 개발자가 정말 원한다면 클래스 외부에서 이러한 가치를 얻을 수 있도록 합니다.
그래서 여기서 우리가 정말로 이야기하고 있는 것은 단지 우리가 원하는 기능을 제공하는 공공용 인터페이스를 정의하고 우리가 "사적"이라고 생각하는 나머지를 "숨기는" 방법입니다.
은 인페이스선메커은즘니터언를는입니다.protocol
그리고 이 목적으로 사용될 수 있습니다.
protocol MyClass {
var publicProperty:Int {get set}
func publicMethod(foo:String)->String
}
class MyClassImplementation : MyClass {
var publicProperty:Int = 5
var privateProperty:Int = 8
func publicMethod(foo:String)->String{
return privateMethod(foo)
}
func privateMethod(foo:String)->String{
return "Hello \(foo)"
}
}
프로토콜은 최고 수준의 유형이며 유형이 가능한 모든 위치에서 사용할 수 있습니다.그리고 이러한 방식으로 사용할 경우에는 구현 유형의 인터페이스가 아닌 자체 인터페이스만 노출됩니다.
그러므로, 당신이 사용하는 한.MyClass
에 MyClassImplementation
매개 변수 유형 등에서 모두 작동해야 합니다.
func breakingAndEntering(foo:MyClass)->String{
return foo.privateMethod()
//ERROR: 'MyClass' does not have a member named 'privateMethod'
}
Swift에 의존하여 추론하는 대신 유형을 명시적으로 지정해야 하는 직접 할당의 경우가 있지만, 이는 거래를 방해하는 것으로 보이지 않습니다.
var myClass:MyClass = MyClassImplementation()
프로토콜을 이런 식으로 사용하는 것은 의미론적이고 상당히 간결하며, 제 눈에는 ObjC에서 이 목적을 위해 사용해온 클래스 익스텐트와 매우 유사합니다.
제가 아는 한, '공공', '개인', '보호'라는 키워드는 없습니다.이것은 모든 것이 공개적이라는 것을 암시합니다.
그러나 Apple은 사람들이 구현 유형의 세부 사항을 숨기기 위해 "프로토콜"(다른 국가에서는 인터페이스라고 함)과 공장 설계 패턴을 사용하기를 기대할 수 있습니다.
논리적 유형 시스템을 동일하게 유지하면서 구현 클래스 계층을 변경할 수 있기 때문에 이 패턴을 사용하는 것이 좋습니다.
프로토콜, 폐쇄 및 중첩/내부 클래스의 조합을 사용하면 모듈 패턴에 따라 Swift에서 정보를 숨길 수 있습니다.그것은 매우 깨끗하지도 않고 읽기에 좋지도 않지만 효과가 있습니다.
예:
protocol HuhThing {
var huh: Int { get set }
}
func HuhMaker() -> HuhThing {
class InnerHuh: HuhThing {
var innerVal: Int = 0
var huh: Int {
get {
return mysteriousMath(innerVal)
}
set {
innerVal = newValue / 2
}
}
func mysteriousMath(number: Int) -> Int {
return number * 3 + 2
}
}
return InnerHuh()
}
HuhMaker()
var h = HuhMaker()
h.huh // 2
h.huh = 32
h.huh // 50
h.huh = 39
h.huh // 59
내부 Val과 신비한 Math는 외부에서 사용되지 않도록 여기에 숨겨져 있으며 객체로 파고들려고 하면 오류가 발생할 수 있습니다.
저는 스위프트 문서를 읽는 과정의 일부일 뿐이므로 여기에 결함이 있다면 지적해 주십시오. 알고 싶습니다.
Xcode 6 베타 4 기준으로 Swift에는 액세스 수식어가 있습니다.릴리스 정보:
신속한 액세스 제어에는 세 가지 액세스 수준이 있습니다.
- 개인 엔터티는 정의된 원본 파일 내에서만 액세스할 수 있습니다.
- 내부 엔티티는 정의된 대상 내의 모든 위치에서 액세스할 수 있습니다.
- 현재 대상의 모듈을 가져오는 다른 컨텍스트와 대상 내의 모든 위치에서 공용 엔티티에 액세스할 수 있습니다.
암시적 기본값은 다음과 같습니다.internal
따라서 응용프로그램 대상 내에서 접근 한정자를 사용하지 않도록 설정할 수 있습니다. 대상 확장 를 공유하기 하는 경우)에서 임워예대상크프에레(" " " 앱과공: 또오는보공간확코위기늘유자하드에를프기장" "경임워다레" "한크를포는사우" "니합용하" "서다"를 합니다.public
프레임워크의 클라이언트에 노출할 API를 지정합니다.
Swift 3.0은 다음과 같은 5가지 액세스 제어 기능을 제공합니다.
- 열다.
- 일반의
- 내부의
- 비공개로 파일
- 사적인
개방형 액세스 및 공용 액세스를 사용하면 엔티티를 정의 모듈의 소스 파일 내에서 사용할 수 있으며 정의 모듈을 가져오는 다른 모듈의 소스 파일에서도 사용할 수 있습니다.일반적으로 프레임워크에 대한 공용 인터페이스를 지정할 때는 개방형 또는 공용 액세스를 사용합니다.
내부 액세스를 사용하면 엔티티를 정의 모듈의 소스 파일 내에서 사용할 수 있지만 해당 모듈 외부의 소스 파일에서는 사용할 수 없습니다.일반적으로 앱 또는 프레임워크의 내부 구조를 정의할 때 내부 액세스를 사용합니다.
파일 개인 액세스는 엔터티의 사용을 고유한 정의 원본 파일로 제한합니다.파일 개인 액세스를 사용하면 특정 기능의 구현 세부 정보가 전체 파일 내에서 사용될 때 해당 세부 정보를 숨길 수 있습니다.
개인 액세스는 엔터티의 사용을 동봉 선언으로 제한합니다.특정 기능의 구현 세부 정보가 단일 선언 내에서만 사용되는 경우 해당 기능의 구현 세부 정보를 숨기려면 개인 액세스를 사용합니다.
열다.액세스는 가장 높은(최소한의) 액세스 단계이고 개인 액세스는 가장 낮은(가장 제한적인) 액세스 단계입니다.
기본 액세스 수준
사용자가 직접 명시적 액세스 수준을 지정하지 않은 경우 코드의 모든 엔티티(몇 가지 특정 예외 제외)는 기본 액세스 수준이 내부입니다.따라서 대부분의 경우 코드에 명시적인 액세스 단계를 지정할 필요가 없습니다.
이 주제에 대한 릴리스 노트:
공용으로 선언된 클래스는 더 이상 정의 모듈 외부에서 하위 분류할 수 없으며 공용으로 선언된 메서드는 더 이상 정의 모듈 외부에서 재정의할 수 없습니다.클래스를 외부적으로 하위 분류하거나 메서드를 외부적으로 재정의하려면 해당 클래스를 공개되지 않은 새로운 액세스 단계인 열린 상태로 선언합니다.가져온 Objective-C 클래스 및 메서드는 이제 모두 공용이 아닌 열린 상태로 가져옵니다.@testable 가져오기를 사용하여 모듈을 가져오는 장치 테스트는 여전히 공용 또는 내부 클래스를 하위 클래스로 분류하고 공용 또는 내부 메서드를 재정의할 수 있습니다(SE-0117).
더 많은 정보와 세부사항 : 더 스위프트 프로그래밍 언어 (접근 제어)
베타 6에서 설명서에는 세 가지 액세스 수정자가 있다고 나와 있습니다.
- 일반의
- 내부의
- 사적인
이 세 가지는 클래스, 프로토콜, 기능 및 속성에 적용됩니다.
public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}
이제 베타 4에서는 Swift에 액세스 수식어를 추가했습니다.
신속한 액세스 제어에는 세 가지 액세스 수준이 있습니다.
private
엔티티는 정의된 소스 파일 내에서만 액세스할 수 있습니다.internal
엔티티는 정의된 대상 내의 모든 위치에서 액세스할 수 있습니다.public
엔티티는 대상 내의 모든 위치와 현재 대상의 모듈을 가져오는 다른 컨텍스트에서 액세스할 수 있습니다.기본적으로 소스 파일의 대부분의 엔티티는 내부 액세스 권한을 가집니다.이를 통해 애플리케이션 개발자는 액세스 제어를 크게 무시할 수 있으며 프레임워크 개발자는 프레임워크의 API를 완전히 제어할 수 있습니다.
Xcode 6에 도입된 액세스 제어 메커니즘:
Swift는 코드 내 엔티티에 대해 세 가지 액세스 수준을 제공합니다.이러한 액세스 수준은 엔터티가 정의된 원본 파일과 관련이 있으며 원본 파일이 속한 모듈과도 관련이 있습니다.
- 공용 액세스를 사용하면 엔티티를 정의 모듈의 소스 파일 내에서 사용할 수 있고 정의 모듈을 가져오는 다른 모듈의 소스 파일에서도 사용할 수 있습니다.일반적으로 프레임워크에 대한 공용 인터페이스를 지정할 때 공용 액세스를 사용합니다.
- 내부 액세스를 사용하면 엔티티를 정의 모듈의 소스 파일 내에서 사용할 수 있지만 해당 모듈 외부의 소스 파일에서는 사용할 수 없습니다.일반적으로 앱 또는 프레임워크의 내부 구조를 정의할 때 내부 액세스를 사용합니다.
- 개인 액세스는 엔터티의 사용을 고유한 정의 원본 파일로 제한합니다.개인 액세스를 사용하여 특정 기능의 구현 세부 정보를 숨깁니다.
공용 액세스는 가장 높은(가장 제한적인) 액세스 단계이고 개인 액세스는 가장 낮은(또는 가장 제한적인) 액세스 단계입니다.
기본값은 내부적으로 액세스하므로 지정할 필요가 없습니다.또한 개인 지정자는 클래스 수준에서 작동하지 않고 원본 파일 수준에서 작동합니다.즉, 클래스의 일부를 실제로 비공개로 만들려면 클래스의 파일로 분리해야 합니다.또한 유닛 테스트와 관련하여 몇 가지 흥미로운 사례를 소개합니다.
위의 링크에서 언급된 제가 언급한 또 다른 요점은 액세스 수준을 '업그레이드'할 수 없다는 것입니다.무언가를 하위 분류하면 더 제한할 수 있지만 그 반대는 아닙니다.
이 마지막 비트는 함수, 튜플, 그리고 확실히 다른 것들에 영향을 미칩니다. 예를 들어, 함수가 개인 클래스를 사용하는 경우, 그들이 개인 클래스에 액세스할 수 없기 때문에 내부 또는 공용 기능을 갖는 것은 유효하지 않습니다.이 경우 컴파일러 경고가 발생하며, 이 함수를 개인 함수로 다시 선언해야 합니다.
Swift 3과 4는 변수와 방법의 액세스 수준에도 많은 변화를 가져왔습니다.Swift 3과 4에는 이제 4가지 액세스 레벨이 있습니다. 여기서 개방형/공개형 액세스는 가장 높은(최소한의) 액세스 레벨이고 개인 액세스는 가장 낮은(가장 제한적인접형 액세스는 가장 낮은(가장 제한적인) 액세스 레벨입니다.
- 개인 함수 및 멤버는 엔티티 자체(구조, 클래스 등) 및 해당 확장의 범위 내에서만 액세스할 수 있습니다(스위프트 3에서도 확장이 제한됨).
- 파일 개인 함수 및 구성원은 선언된 원본 파일 내에서만 액세스할 수 있습니다.
- 내부 함수 및 구성원(액세스 단계 키워드를 명시적으로 추가하지 않은 경우 기본값)은 정의된 대상 내의 모든 위치에서 액세스할 수 있습니다.그렇기 때문에 TestTarget은 모든 소스에 자동으로 액세스할 수 없으며 xCode의 파일 검사기에서 액세스 가능한 것으로 표시해야 합니다.
- 현재 대상의 모듈을 가져오는 다른 컨텍스트 및 대상 내의 어디에서나 열린 또는 공개 함수 및 구성원에 액세스할 수 있습니다.
흥미로운 점:
모든 메서드 또는 멤버를 "개인"으로 표시하는 대신 클래스/구조체의 확장에서 일부 메서드(예: 일반적으로 도우미 기능)를 포함하고 전체 확장을 "개인"으로 표시할 수 있습니다.
class foo { }
private extension foo {
func somePrivateHelperFunction01() { }
func somePrivateHelperFunction02() { }
func somePrivateHelperFunction03() { }
}
이것은 더 나은 유지관리 가능한 코드를 얻기 위해 좋은 아이디어가 될 수 있습니다.또한 단어 하나만 변경해도 쉽게 비사용으로 전환할 수 있습니다(예: 장치 테스트용).
Swift 1-3의 경우:
아니, 가능하지 않아요.개인/보호된 메서드 및 변수가 전혀 없습니다.
모든 것이 공개됩니다.
업데이트 Swift 4 이후 이 스레드에서 다른 답변을 볼 수 있습니다.
사용할 수 있는 옵션 중 하나는 인스턴스 작성을 함수로 래핑하고 생성자에 적절한 게터와 세터를 제공하는 것입니다.
class Counter {
let inc: () -> Int
let dec: () -> Int
init(start: Int) {
var n = start
inc = { ++n }
dec = { --n }
}
}
let c = Counter(start: 10)
c.inc() // 11
c.inc() // 12
c.dec() // 11
언어 문법에는 'public', 'private' 또는 'protected' 키워드가 없습니다.이것은 모든 것이 공개적이라는 것을 암시합니다.물론 이러한 키워드 없이 액세스 수식자를 지정하는 다른 방법이 있을 수 있지만 언어 참조에서 찾을 수 없었습니다.
보호된 방법과 유사한 것을 원하는 사람들을 위해 시간을 절약하기를 바랍니다.
다른 답변에 따르면 swift는 이제 Java 또는 C#과 같은 클래스 단위가 아닌 파일 단위로 정의된 '개인' 한정자를 제공합니다.즉, 보호된 메서드를 원할 경우 동일한 파일에 있는 경우 swift private 메서드를 사용하여 수행할 수 있습니다.
- '보호된' 메서드를 보유할 기본 클래스 만들기(실제 비공개)
- 동일한 메서드를 사용하려면 이 클래스를 하위 클래스로 분류합니다.
- 다른 파일에서는 하위 클래스인 경우에도 기본 클래스 메서드에 액세스할 수 없습니다.
예: 파일 1:
class BaseClass {
private func protectedMethod() {
}
}
class SubClass : BaseClass {
func publicMethod() {
self.protectedMethod() //this is ok as they are in same file
}
}
파일 2:
func test() {
var a = BaseClass()
a.protectedMethod() //ERROR
var b = SubClass()
b.protectedMethod() //ERROR
}
class SubClass2 : BaseClass {
func publicMethod() {
self.protectedMethod() //ERROR
}
}
swift 2.0까지는 3개의 액세스 레벨(Public, internal, private)만 있었지만 swift 3.0에서는 2개의 새로운 액세스 레벨([Open, fileType])이 추가되었습니다. 따라서 swift 3.0에서는 5개의 액세스 레벨이 있습니다. 여기서 이 두 액세스 레벨 1의 역할을 지웁니다.열기: 공용과 매우 유사하지만 유일한 차이점은 공용이 하위 클래스에 액세스하고 재정의할 수 있으며, 열린 액세스 단계에서는 이 이미지를 보통 웹 사이트에서 가져온 것에 액세스할 수 없다는 것입니다. 이는 개방형 액세스와 공개 액세스의 차이를 나타냅니다.
이제 두 번째 새로운 액세스 수준 2. 파일 형식은 내부보다 개인용 또는 더 적은 액세스 수준입니다. fileType은 [class, struct,]의 확장된 부분에 액세스할 수 있습니다.enum] 및 private는 코드의 확장 부분에 액세스할 수 없습니다. 이 이미지는 중간 웹 사이트에서 가져온 어휘 범위에만 액세스할 수 있습니다. 이는 fileType과 개인 액세스 수준의 차이를 설명합니다.
언급URL : https://stackoverflow.com/questions/24003918/does-swift-have-access-modifiers
'programing' 카테고리의 다른 글
Java용 Eclipse IDE - 완전 다크 테마 (0) | 2023.05.11 |
---|---|
SQL Server 연결된 서버 예제 쿼리 (0) | 2023.05.11 |
AKS(Azure Managed Kubernetes)에서 모든 컴퓨팅을 중지 (0) | 2023.05.11 |
Postgre에 행이 있는지 가장 빠르게 확인SQL (0) | 2023.05.11 |
어떻게 f-string 평가를 연기/연기합니까? (0) | 2023.05.11 |