Swift에 액세스 수정자가 있습니까?


273

Objective-C 인스턴스에서 데이터는 또는 public일 수 있습니다 . 예를 들면 다음과 같습니다.protectedprivate

@interface Foo : NSObject
{
  @public
    int x;
  @protected:
    int y;
  @private:
    int z;
  }
-(int) apple;
-(int) pear;
-(int) banana;
@end

Swift 참조에서 액세스 수정 자에 대한 언급을 찾지 못했습니다. Swift에서 데이터의 가시성을 제한 할 수 있습니까?


나도 마찬가지야 애플은 적어도 파이썬처럼 밑줄이 붙은 개인용 에티켓을 소개해야한다.
Ciantic 2016 년


스위프트 4 업데이트 답변 .
Ahmad F

답변:


419

현재 스위프트 3.0.1 있다 액세스 4 단계 최저 (가장 제한)에 가장 높은 (최소 제한)에서 설명을.


1. open그리고public

정의 모듈 (대상) 외부에서 엔티티를 사용할 수 있도록합니다. 일반적으로 프레임 워크에 공용 인터페이스를 지정할 때 사용 open하거나 public액세스합니다.

그러나 open액세스는 클래스 및 클래스 멤버에만 적용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

삼. 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

37
누군가 이것이 왜 그렇게 중요하지 않은지 설명해 줄 수 있습니까?
Zaky German

15
OOP 에는 항상 비공개이거나 보호되어야하는 일부 메소드 또는 변수가 있습니다. 이를 통해 큰 방법은 각각의 책임이있는 여러 개의 작은 방법으로 나뉘어 재정의 될 수 있지만 "main"방법 만 공용으로 사용할 수 있으므로 SOLID 설계 를 구현할 수 있습니다.
akashivskyy 2016 년

19
나는 개인적으로 밑줄 / 특별 문자를 주도하는 "비공개"방법을 사용하는 것과 같은 솔루션을 좋아하지 않습니다. 내가이 코드를 보았던 유일한 사람이 될 것이라고 보장 되더라도 오류가 발생하기 쉬운 코드를 더 저장 / 덜 발생하게 만듭니다 컴파일러는 단순히하지 말아야 할 일을 방해합니다. 그래서 나는 그들이 "액세스 제어 메커니즘"을 가능한 한 빨리 꺼내야한다고 생각합니다. 그래서 사람들은 나쁜 습관에 익숙해지지 않을 것입니다.
Jonas Eschmann

10
Xcode 6 베타 릴리스 노트에 "액세스 제어 (공개 / 개인 구성원)는이 시드에서 사용할 수 없습니다. (15747445)"
Martin Ullrich

9
@alcalde 퍼블릭 인터페이스의 아이디어는 매우 소중합니다. 클래스의 모든 코드가 퍼블릭 API의 일부인 함수 내에 있어야한다면 상당히 제한적이라고 생각합니다. 반면에, 공개 API를 지정하면 소비자를 방해하지 않고 구현이 변경 될 수 있습니다 (개인 메소드 사용 포함). 누군가 내부 클래스 메서드를 사용해야하는 경우 클래스 기능의 한계를 잘못 이해하고 있거나 버그가있는 클래스를 사용하려고합니다.
jinglesthula

26

스위프트 4 / 스위프트 5

Swift Documentation-Access Control에 언급 된대로 Swift에는 5 가지 액세스 제어가 있습니다 .

  • open public : 모듈의 엔티티 및 정의 모듈을 가져 오는 모든 모듈의 엔티티에서 액세스 할 수 있습니다.

  • internal : 모듈의 엔티티에서만 액세스 할 수 있습니다. 기본 액세스 수준입니다.

  • fileprivate private : 사용자가 정의한 제한된 범위 내에서만 제한적으로 액세스 할 수 있습니다.



공개공개 의 차이점은 무엇입니까 ?

open 은 이전 버전의 Swift에서 공개 된 것과 동일하며 다른 모듈의 클래스가이를 사용하고 상속 할 수 있습니다. 즉, 다른 모듈에서 서브 클래 싱 될 수 있습니다. 또한 다른 모듈의 구성원이이를 사용하고 대체 할 수 있습니다. 모듈에도 동일한 논리가 적용됩니다.

public 은 다른 모듈의 클래스가 클래스를 사용하도록 허용하지만 상속 하지는 않습니다 . 즉, 다른 모듈에서 서브 클래 싱 할 수 없습니다 . 또한 다른 모듈의 구성원이이를 사용할 수 있지만 대체하지는 않습니다. 모듈의 경우 동일한 개방형 논리를 갖습니다 (클래스가 클래스를 사용하고 상속 할 수 있도록 허용합니다.


fileprivateprivate 의 차이점은 무엇입니까 ?

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 액세스 제어의 차이점은 무엇입니까?

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으로 fileprivate 전체 파일에 액세스 할 수는.


17

Swift 또는 ObjC (또는 ruby ​​또는 java 또는…)에서 "비공개 메소드"를 작성하는 것에 대해 이야기 할 때, 해당 메소드는 실제로 비공개 가 아닙니다 . 주변에 실제 액세스 제어가 없습니다. 약간의 내성도를 제공하는 모든 언어를 통해 개발자는 원하는 경우 클래스 외부에서 해당 값을 얻을 수 있습니다.

우리가 여기서 실제로 이야기하고있는 것은 단지 우리가 원하는 기능 만 제시 하고 "개인"으로 간주하는 나머지 부분을 "숨기는" 공용 인터페이스를 정의하는 방법 입니다.

인터페이스 선언을위한 Swift 메커니즘은 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에서이 목적으로 사용했던 클래스 확장과 매우 ​​비슷합니다.


1
프로토콜이 기본 인수를 허용하지 않는 경우 프로토콜을 여전히 준수하는 선택적 매개 변수를 사용하여 공용 메소드를 작성하려면 어떻게해야합니까?
bdurao

무슨 말인지 모르겠어요 다음은 선택적 매개 변수를 사용하여 공용 메소드를 작성합니다. 문제가없는 것 같습니다 : gist.github.com/anonymous/17d8d2d25a78644046b6
jemmons

어떤 이유로 선택적 매개 변수가 내 프로젝트에서 제대로 작동하지 않고 이미 GitHub 예제와 비슷한 것을 시도했습니다. 프로토콜에서 기본 매개 변수를 설정할 수 없으므로 문제가 발생했습니다. 도와 주셔서 감사합니다.
bdurao

우리는 모두 해킹이 가능하다는 것을 알고 있습니다. 액세스 수정자가 필요한 이유는 무엇입니까?
canbax

14

내가 알 수있는 한 키워드 'public', 'private'또는 'protected'는 없습니다. 이것은 모든 것이 공개되었음을 암시합니다.

그러나 애플은 사람들이 " 프로토콜 "(세계의 인터페이스라고 함)과 팩토리 디자인 패턴 을 사용하여 구현 유형의 세부 사항을 숨길 것을 기대할 수 있습니다 .

어쨌든 사용하기에 좋은 디자인 패턴입니다. 논리 유형 시스템을 동일 하게 유지하면서 구현 클래스 계층 구조 를 변경할 수 있습니다 .


커플 링을 줄이고 테스트를 더 쉽게 할 수 있기 때문에 좋습니다.
Scroog1 2016 년

4
프로토콜의 구현 클래스를 숨길 수있는 방법이 있다면 더 잘 작동하지만 그렇지 않은 것 같습니다.
David Moles 2016 년

누구든지이 패턴의 예시를 제공 할 수 있습니까?
bloudermilk

글쎄,이 답변은 이전 스위프트 버전에서 유효했습니다. 더 이상 유효하지 않은 것 같습니다 :) 내 답변을 확인하십시오 .
Ahmad F

12

프로토콜, 클로저 및 중첩 / 내부 클래스의 조합을 사용하면 모듈 패턴의 선을 따라 무언가를 사용하여 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

innerVal과 mysteriousMath는 외부 사용에서 숨겨져 있으며 객체로 길을 찾으려고 시도하면 오류가 발생합니다.

나는 Swift 문서를 읽음으로써 길의 일부에 불과하므로 여기에 결함이 있으면 지적하고 알고 싶습니다.


좋아,이 솔루션에 대해서도 생각했지만 왜 h.huh.innerVal에 액세스 할 수 없습니까?
Sam

스위프트는 형식이 안전하며 외부 세계가 h에 대해 아는 유일한 것은 그것이 HuhThing을 준수한다는 것입니다. HuhThing에는 innerVal이라는 속성에 대한 정보가 포함되어 있지 않으므로 액세스하려고하면 오류가 발생합니다.
Dave Kapp

8
여전히 접근 가능 : Preflect(h)[0].1.value // 19
John Estropia

2
존을 찾아서 반가워하지 않았다. 객체를 Tuples로 바꾸는 것 같습니다-Swift의 해당 기능 또는 기타 메타 프로그래밍 관련 공식 문서가 있습니까? iBooks의 언어 가이드를 살펴 보았지만 보이지 않습니다.
Dave Kapp 2016

1
@ JohnEstropia 나는 반사가 중요하다고 생각하지 않습니다. Java (보다 성숙한 언어) 에는 액세스 수정자가 있지만 리플렉션 트릭을 방지하지는 않습니다.
11684

10

Xcode 6 베타 4부터 Swift에는 액세스 수정자가 있습니다. 릴리스 정보에서 :

신속한 액세스 제어에는 세 가지 액세스 레벨이 있습니다.

  • 개인 엔티티는 정의 된 소스 파일 내에서만 액세스 할 수 있습니다.
  • 내부 엔터티는 정의 된 대상 내의 어느 곳에서나 액세스 할 수 있습니다.
  • 공개 엔티티는 대상 내 어디에서나 현재 대상 모듈을 가져 오는 다른 컨텍스트에서 액세스 할 수 있습니다.

암시 적 기본값은 internal이므로 응용 프로그램 대상 내에서보다 제한적인 위치를 제외하고 액세스 수정자를 해제 한 상태로 둘 수 있습니다. 프레임 워크 대상에서 (예 : 앱과 공유 또는 Today 뷰 확장간에 코드를 공유하기 위해 프레임 워크를 임베드하는 경우) public프레임 워크의 클라이언트에 노출하려는 API를 지정 하는 데 사용 하십시오.


글쎄,이 답변은 이전 스위프트 버전에서 유효했습니다. 더 이상 유효하지 않은 것 같습니다 :) 내 답변을 확인하십시오 .
Ahmad F

6

Swift 3.0은 다섯 가지 액세스 제어를 제공합니다.

  1. 열다
  2. 공공의
  3. 내부의
  4. 개인 파일
  5. 은밀한

공개 액세스 및 공개 액세스를 통해 엔티티를 정의 모듈의 소스 파일 내에서 정의 모듈을 가져 오는 다른 모듈의 소스 파일에서도 사용할 수 있습니다. 프레임 워크에 공용 인터페이스를 지정할 때 일반적으로 공개 또는 공용 액세스를 사용합니다.

내부의 액세스를 통해 정의 모듈의 소스 파일 내에서 엔티티를 사용할 수 있지만 해당 모듈 외부의 소스 파일에서는 사용할 수 없습니다. 일반적으로 앱 또는 프레임 워크의 내부 구조를 정의 할 때 내부 액세스를 사용합니다.

파일 개인 액세스는 엔티티 사용을 자체 정의 소스 파일로 제한합니다. 파일 개인 액세스를 사용하여 세부 사항이 전체 파일 내에서 사용될 때 특정 기능의 구현 세부 사항을 숨기십시오.

개인 액세스는 엔터티 사용을 엔 클로징 선언으로 제한합니다. 세부 사항이 단일 선언 내에서만 사용되는 경우 개인 액세스를 사용하여 특정 기능의 구현 세부 사항을 숨기십시오.

공개 액세스는 최고 (최소 제한) 액세스 수준이고 개인 액세스는 가장 낮은 (가장 제한적) 액세스 수준입니다.

기본 액세스 수준

명시 적 액세스 수준을 직접 지정하지 않으면 코드의 모든 엔터티 (일부 특정 예외 제외)는 기본 액세스 수준이 internal입니다. 결과적으로 대부분의 경우 코드에서 명시 적 액세스 수준을 지정할 필요가 없습니다.

주제에 대한 릴리스 정보 :

public으로 선언 된 클래스는 더 이상 정의 모듈 외부에서 서브 클래 싱 될 수 없으며, public으로 선언 된 메소드는 더 이상 정의 모듈 외부에서 재정의 될 수 없습니다. 클래스를 외부에서 서브 클래스로 만들거나 메소드를 외부에서 재정의하려면 클래스를 공개로 넘어서는 새로운 액세스 수준 인 공개로 선언하십시오. 가져온 Objective-C 클래스 및 메소드는 모두 공개가 아닌 공개로 가져옵니다. @testable 가져 오기를 사용하여 모듈을 가져 오는 단위 테스트는 여전히 공개 또는 내부 클래스를 서브 클래스하고 공개 또는 내부 메소드를 대체 할 수 있습니다. (SE-0117)

자세한 정보 및 세부 사항 : Swift Programming Language (Access Control)


글쎄,이 답변은 이전 스위프트 버전에서 유효했습니다. 더 이상 유효하지 않은 것 같습니다 :) 내 답변을 확인하십시오 .
Ahmad F

4

베타 6에서 설명서에는 세 가지 액세스 수정자가 있다고 명시되어 있습니다.

  • 공공의
  • 내부의
  • 은밀한

그리고이 세 가지는 클래스, 프로토콜, 함수 및 속성에 적용됩니다.

public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}

자세한 내용은 액세스 제어를 확인 하십시오 .


보안이 강화 된 클래스를 쉽게 만들 수있는 보호 된 수정자가 있어야합니다.
Kumar C

글쎄,이 답변은 이전 스위프트 버전에서 유효했습니다. 더 이상 유효하지 않은 것 같습니다 :) 내 답변을 확인하십시오 .
Ahmad F

2

베타 4에서는 Swift에 액세스 수정자를 추가했습니다.

에서 엑스 코드 6 베타 4 개 realese 노트 :

신속한 액세스 제어에는 세 가지 액세스 레벨이 있습니다.

  • private 엔티티는 정의 된 소스 파일 내에서만 액세스 할 수 있습니다.
  • internal 정의 된 대상 내의 어느 곳에서나 엔티티에 액세스 할 수 있습니다.
  • public 대상 내 어디에서나 현재 대상의 모듈을 가져 오는 다른 컨텍스트에서 엔티티에 액세스 할 수 있습니다.

기본적으로 소스 파일의 대부분의 엔터티에는 내부 액세스 권한이 있습니다. 따라서 응용 프로그램 개발자는 액세스 제어를 크게 무시하고 프레임 워크 개발자는 프레임 워크 API를 완전히 제어 할 수 있습니다.


이것에 대한 링크를 게시 할 수 있습니까?
눈사람

글쎄,이 답변은 이전 스위프트 버전에서 유효했습니다. 더 이상 유효하지 않은 것 같습니다 :) 내 답변을 확인하십시오 .
Ahmad F

2

Xcode 6에 도입 된 액세스 제어 메커니즘 :

Swift는 코드 내 엔티티에 대해 세 가지 액세스 수준을 제공합니다. 이러한 액세스 수준은 엔터티가 정의 된 소스 파일 및 소스 파일이 속한 모듈과 관련됩니다.

  • 공개 액세스를 통해 엔티티를 정의 모듈의 소스 파일 내에서 정의 모듈을 가져 오는 다른 모듈의 소스 파일에서도 사용할 수 있습니다. 프레임 워크에 공용 인터페이스를 지정할 때 일반적으로 공용 액세스를 사용합니다.
  • 내부 액세스를 통해 정의 모듈의 소스 파일 내에서 엔티티를 사용할 수 있지만 해당 모듈 외부의 소스 파일에서는 사용할 수 없습니다. 일반적으로 앱 또는 프레임 워크의 내부 구조를 정의 할 때 내부 액세스를 사용합니다.
  • 개인 액세스 는 엔티티 사용을 자체 정의 소스 파일로 제한합니다. 개인 액세스를 사용하여 특정 기능의 구현 세부 사항을 숨기십시오.

공개 액세스는 최고 (최소 제한) 액세스 수준이고 개인 액세스는 최저 (또는 가장 제한적) 액세스 수준입니다.

그것은 accecss 기본 내부 및 지정할 필요가 같은 않습니다. 또한 개인 지정이 수행 되지 클래스 수준에서 작업을하지만, 소스 파일 수준. 이것은 클래스의 일부를 실제로 비공개로 만들려면 자체 파일로 분리해야 함을 의미합니다. 이것은 또한 단위 테스트와 관련하여 흥미로운 사례를 소개합니다 ...

위 링크에서 언급 한 또 다른 요점은 액세스 수준을 '업그레이드'할 수 없다는 것입니다. 무언가를 서브 클래 싱하면 더 제한 할 수 있지만 다른 방법으로는 제한 할 수 없습니다.

이 마지막 비트는 즉, 함수가 사용하는 경우하는 방식에 기능, 튜플과 확실히 다른 것들에 영향을 미치는 개인 클래스를, 다음은 함수가 가지고 유효하지의 내부 또는 공공 그들이에 액세스 할 수 없을 수도로, 개인 클래스를. 이로 인해 컴파일러 경고가 발생하며 함수를 개인 함수 로 다시 선언해야 합니다.


글쎄,이 답변은 이전 스위프트 버전에서 유효했습니다. 더 이상 유효하지 않은 것 같습니다 :) 내 답변을 확인하십시오 .
Ahmad F

2

스위프트 3과 4 는 변수와 메소드의 접근 수준에도 많은 변화를 가져 왔습니다. Swift 3과 4는 이제 4 가지 액세스 수준을 가지는데, 공개 / 공개 액세스는 최고 (최소 제한) 액세스 수준이고 개인 액세스는 최저 (가장 제한적) 액세스 수준입니다.

  • 개인 기능과 멤버는 엔티티 자체의 범위 (struct, class, ...)와 그 확장 내에서만 액세스 할 수 있습니다 (Swift 3에서는 확장이 제한되었습니다)
  • 개인 파일 함수 및 멤버는 선언 된 소스 파일 내에서만 액세스 할 수 있습니다.
  • 내부 함수 및 멤버 (액세스 레벨 키워드를 명시 적으로 추가하지 않은 경우 기본값 임)는 정의 된 대상 내의 어느 곳에서나 액세스 할 수 있습니다. 따라서 TestTarget이 모든 소스에 자동으로 액세스 할 수없는 이유는 xCode의 파일 관리자에서 액세스 가능한 것으로 표시해야합니다.
  • 공개 또는 공개 기능 및 멤버는 대상 내 어디서나 현재 대상의 모듈을 가져 오는 다른 컨텍스트에서 액세스 할 수 있습니다.

흥미로운 :

모든 단일 메소드 또는 멤버를 "비공개"로 표시하는 대신 클래스 / 구조의 확장에서 일부 메소드 (예 : 일반적으로 헬퍼 함수)를 처리하고 전체 확장을 "비공개"로 표시 할 수 있습니다.

class foo { }

private extension foo {
    func somePrivateHelperFunction01() { }
    func somePrivateHelperFunction02() { }
    func somePrivateHelperFunction03() { }
}

더 나은 유지 관리 가능한 코드를 얻으려면 좋은 아이디어가 될 수 있습니다. 또한 한 단어 만 바꾸면 쉽게 (예 : 단위 테스트 용) 비 개인용으로 전환 할 수 있습니다.

애플 문서


글쎄,이 답변은 이전 스위프트 버전에서 유효했습니다. 더 이상 유효하지 않은 것 같습니다 :) 내 답변을 확인하십시오 .
Ahmad F

2

스위프트 1-3의 경우 :

아니요, 불가능합니다. 개인 / 보호 된 메소드와 변수는 전혀 없습니다.

모든 것이 공개됩니다.

업데이트 스위프트 4 이후,이 스레드에서 가능한 참조 다른 답변을의


1
이 주석은 현재 시드에 대해 정확합니다.
Jesper

2
현재 시드 앞으로 나타날 것 입니다.
Jesper

1
"public"/ "protected"/ "private"은 현재 존재하지 않지만 클로저, 프로토콜 및 내부 클래스를 사용하여 항목을 숨길 수 있습니다. 이는 JavaScript에서 일반적으로 사용되는 모듈 패턴과 다소 비슷합니다. 이 작업을 수행하는 방법에 대한 예제는 여기 회신에있는 샘플 코드를 참조하십시오. 그것이 어떻게 작동하는지에 대해 잘못 생각하고 내 예제가 틀렸다면 여전히 배우고 있음을 지적하십시오. :)
Dave Kapp

더 이상 유효하지 않은 것 같습니다 :) 내 대답을 확인하십시오 .
Ahmad F

1

사용할 수있는 옵션 중 하나는 인스턴스 작성을 함수로 랩핑하고 생성자에 적절한 getter 및 setter를 제공하는 것입니다.

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

0

언어 문법 키워드 '대중', '개인'또는 '보호'를 가지고 있지 않습니다. 이것은 모든 것이 공개되었음을 암시합니다. 물론, 키워드없이 액세스 수정자를 지정하는 대체 방법이 있지만 언어 참조에서 찾을 수 없었습니다.


0

보호 된 방법과 비슷한 것을 원하는 사람들을 위해 시간을 절약하기를 바랍니다.

다른 답변에 따르면, swift는 이제 'private'수정자를 제공합니다.이 수정자는 Java 또는 C #과 같은 클래스 방식이 아니라 파일 방식으로 정의됩니다. 즉, 보호 된 메소드를 원할 경우 동일한 파일에있는 경우 빠른 개인용 메소드로이를 수행 할 수 있습니다.

  1. '보호 된'메소드를 보유 할 기본 클래스 작성 (실제로는 비공개)
  2. 동일한 메소드를 사용하기 위해이 클래스를 서브 클래스 화하십시오
  3. 다른 파일에서는 서브 클래스 중 하나라도 기본 클래스 메소드에 액세스 할 수 없습니다.

예 : 파일 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
    }

}



-2

swift 2.0까지는 세 가지 액세스 수준 (공개, 내부, 개인) 만 있었지만 swift 3.0 애플은 [Open, fileType]이라는 두 가지 새로운 액세스 수준을 추가했습니다. 따라서 swift 3.0에는 5 개의 액세스 수준이 있습니다. 여기서 역할을 지우고 싶습니다 공개 : 이것은 공개와 매우 유사하지만 공개의 차이점은 공개가 서브 클래스에 액세스하고 대체 할 수 있으며 공개 액세스 레벨 이이 이미지를 중간 웹 사이트에서 가져온 것으로 액세스 할 수 없다는 점입니다. 공개 및 공개 액세스

이제 두 번째 새로운 액세스 수준 2입니다. filetype은 private보다 큰 버전이거나 private보다 낮은 수준입니다. fileType은 [class, struct, enum]의 확장 부분에 액세스 할 수 있으며 private은 액세스 할 수있는 코드의 확장 부분에 액세스 할 수 없습니다 이 이미지는 보통 웹 사이트에서 가져온 어휘 범위 이며 fileType과 개인 액세스 레벨의 차이점을 설명합니다.

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