2019 년 1 월 10 일 린더 드 브리스 글 앱 개발,스위프트

싱글 톤은 정확히 하나의 인스턴스가 존재하는 클래스로 전 세계적으로 액세스 할 수 있습니다. 당신은 어떻게 스위프트에서 싱글을 만들 수 있습니까? 그리고 당신은 왜 또는 안해야합니까?

이 튜토리얼에서는 스위프트에서 싱글 톤에 뛰어들 것입니다. 싱글 톤 디자인 패턴이 무엇인지,왜 유용한 지 배웁니다. 우리는 스위프트에서 싱글 톤을 만들기위한 구문을 논의 할 것이다. 그리고 우리는 싱글 톤에 대한 좋고 나쁜 사용 사례를 접하게 될 것입니다.

준비 됐어? 가자

  1. 싱글톤이란?
  2. 스위프트에서 싱글 톤 코딩
  3. 싱글 톤 사용시기
  4. 추가 읽기

싱글 톤이란 무엇입니까?

싱글톤은 하나의 인스턴스만 존재하는 클래스입니다. 몇 가지 예:

  • 회사는 단 하나의CEO
  • 운영 체제는 단 하나의 파일 시스템을 가지고
  • 태양계 몸체는 하나의 중력점을 중심으로 회전
  • 입출력은 단 하나의 기본FileManager
  • 비행기는 단 하나의 비행 갑판

싱글 톤의 두 번째 속성은 전역 액세스 지점을 가지고 있다는 것입니다. 예를 들어,싱글 톤에 액세스 할 수 있습니다. 앱 코드의 어느 곳에서나 함수를 호출할 수 있습니다.

그래서,요약:

  1. 싱글톤은 전 세계적으로 액세스할 수 있는 인스턴스가 하나만 있는 클래스입니다. 다음과 같은 일반적인 수업NotificationCenter, UserDefaults, SKPaymentQueue 그리고FileManager는 싱글 톤 인shared또는default속성을 갖습니다.

    다른 경우에는 싱글 톤을 직접 만들 수도 있습니다. 좋은 사용 사례는shared속성을 통해 싱글톤 인스턴스를 노출하는API클래스입니다. API.shared.makeAPICall()을 사용하여 단일 통합 인스턴스를 통해 액세스합니다. 예를 들어,이를 통해 호출을 순차적으로 관리 할 수 있습니다.

    싱글톤이 가장 잘 사용될 때(그리고 그렇지 않을 때)논의하기 전에 스위프트에서 싱글톤을 코딩하는 방법을 알아 보겠습니다.

    을 얻으로 고용자

    를 구축하는 것을 배우십시오 iOS14 앱을 신속한 5

    내 iOS 개발 과정,그리고 시작하는 방법에 대해 알아보십시오 경력으로 전문 iOS 개발자이다.

    스위프트에서 싱글 톤 코딩

    이 스위프트에서 싱글 톤을 만드는 가장 좋은 방법입니다:

    class API{ static let shared = API() private init() { // Set up API instance }}

    싱글 톤을 사용하는 방법은 다음과 같습니다.:

    API.shared.doSomething()

    shared이라는 하나의 정적 속성을 가진API클래스를 만들고 있습니다. 이 속성은 상수이고 정적으로 선언되기 때문에 한 번 설정하면 변경할 수 없습니다.

    API클래스를 통해shared속성에 액세스 할 수 있음을 의미합니다. 이를 종종 클래스 속성이라고 합니다. 이 속성을 클래스의 인스턴스를 통해서만 액세스 할 수있는 일반 인스턴스 속성과 비교하십시오.

    흥미로운 점은shared속성이API클래스 내에서API인스턴스를 초기화한다는 것입니다. 우리는API클래스를 통해 액세스 할 수있는API객체를 만드는 것입니다. 그러나 더 많은 것이 있습니다…

    클래스 이니셜 라이저init()private로 표시됩니다. 이private키워드는API클래스가API클래스 내에서만 초기화될 수 있도록 합니다.

    즉,API클래스 외부의API인스턴스를 만들 수 없습니다! 이렇게 하면 우리가 만든API개체가 코드에서 유일한 인스턴스입니다. 결국,당신은 그것을 더 만들 수 없습니다.

    이제API클래스가 싱글 톤의 두 속성을 준수하는지 확인했습니다:

    1. 정적 속성shared덕분에API인스턴스는 전 세계적으로 액세스 할 수 있습니다
    2. private init()덕분에API클래스는API클래스

    외부에서 초기화 할 수 없습니다. 여기에 무엇이 있습니다:

    API클래스는 대부분 동일합니다. 여전히 싱글 톤이며 여전히static let shared = API()private init()비트의 코드를 사용합니다.

    변경된 내용은 다음과 같습니다.:

    • 이제API클래스에isRequestPending속성이 있습니다. 이것은 위험이 시작되는 곳입니다…isRequestPending부울이 한 번에 하나의 요청 만 수행 할 수 있도록하는 방법을 참조하십시오. (isRequestPending는 인스턴스 속성입니다.)
    • API클래스에는makeAPIRequest()기능도 있습니다. 이 함수를 사용하여 트위터와 같은 웹 서비스에서 일부 데이터를 다시 가져올 수 있다고 상상해보십시오.이 함수에서 다른 요청이 현재 보류 중이 아닌 경우에만 요청을 수행 할 수 있음을 알 수 있습니다.
    • API클래스에는onReturnAPIRequest()기능도 있습니다. 이 기능은 온라인 데이터가 앱에 다운로드 된 경우 호출됩니다. isRequestPending부울이false로 다시 설정되고 요청 데이터가 처리됩니다.

    그리고 코드의 어느 곳에서나API싱글 톤을 사용할 수있는 방법은 다음과 같습니다:

    API.shared.makeAPIRequest()

    우리가 논의해야 할 다른 것이 있습니다. API클래스는 이제 상태라는 것을 관리합니다. 당신은 느낌으로”상태”를 볼 수 있습니다:당신은 행복하거나 슬프거나 화가납니다. 한 상태에서 다른 상태로 전환 할 수 있습니다.

    API클래스는 두 상태 사이를 전환할 수 있습니다:

    • isRequestPendingfalse
    • isRequestPending인 상태true

    다음 섹션에서 배울 수 있듯이 주 및 싱글 톤은 코드에 모든 종류의 혼란을 야기 할 수 있습니다. 제대로 상태를 관리하는 것은 싱글 오용에 대한 하나의 가장 큰 이유입니다.

    싱글톤 사용시기

    싱글톤 사용시기는 언제입니까? 이 책의 디자인 패턴:네의 갱에 의해 재사용 가능한 객체 지향 소프트웨어의 요소는 말을 다음이 있습니다. 다음과 같은 경우 싱글 톤 패턴을 사용하십시오:

    • 클래스의 인스턴스가 정확히 하나 있어야 하며 잘 알려진 액세스 지점에서 클라이언트가 액세스할 수 있어야 합니다.
    • :
      • 코드에 클래스의 인스턴스가 하나 이상 필요하지 않을 때(즉,회사의 최고 경영자)
      • 그리고 코드의 어느 곳에서나 액세스 할 수 있어야 할 때(즉,,파일 시스템)

      또 다른 사용 사례는 서브 클래싱입니다. 코드의 전역 변수는 쉽게 서브 클래스 화 될 수 없으므로 싱글 톤 클래스를 사용하는 이유입니다. 또한 종속성 주입을 사용하여 싱글 톤을 단위 테스트 할 수 있습니다. 5677>인스턴스를APIMock인스턴스로 바꿉니다.

      그리고 언제 싱글 톤을 사용하지 않습니까? 그 질문에 답하기 위해,우리는 앞서 논의한 국가 원칙으로 돌아 가야 할 것입니다.

      초보 개발자들에게 일반적인 함정은 상태와 그 종속성을 제대로 관리하는 것이다. 이전에 작업했던API클래스를 사용하는 앱을 만들고 있다고 가정해 보겠습니다.다음과 같이 점점 더 많은 속성을 사용할 수 있습니다:

      • userID로그인한 사용자를 추적하는 속성,
      • tweets트위터 데이터가 포함된 속성,getTweets()호출이 이루어진
      • spinner요청이 시작될 때 뷰 컨트롤러에 추가하는UIActivityIndicatorView속성>

      처음에,이 할 말이 많이 있습니다. 결국API클래스는 코드의 어느 곳에서나 액세스 할 수 있습니다. 따라서 트윗보기 컨트롤러에서는API.shared.tweets배열을 사용할 수 있으며 설정 컨트롤러에서는userID를 사용하여 설정을 변경할 수 있습니다.

      불행히도,당신의 상태는 이제 사방에 있습니다. 5677>클래스는 클래스의 단일 책임과 관련이 없는 여러 클래스에 종속되어 있습니다. 당신의 코드는 스파게티 한 그릇이되었으며,모두 얽혀 있습니다. 코드는 정상적으로 작동 할 수 있지만 유지 관리 및 확장은 불가능합니다.

      의 예를 살펴 보자. 앞서 정의한onReturnAPIRequest()함수는 단단히 결합 될 위기에 처해 있습니다…

      우리가 고려하고있는 것은 다음과 같습니다:

      • onReturnAPIRequest()는 웹 서비스 요청이 반환 될 때,즉 데이터가 앱에 들어올 때 호출됩니다. 예를 들어 트윗보기 컨트롤러-이 데이터는 어딘가에 갈 필요가있다. API의 데이터를 뷰 컨트롤러로 어떻게 전달합니까?
      • 확실한 선택은API클래스에서viewController에 대한 참조를 만드는 것입니다. 데이터가 들어 오면viewController.tweets = tweetsData과 같은 코드를 작성할 수 있습니다. 불행히도 지금은API과 뷰 컨트롤러가 단단히 결합되어 있기 때문에 아키텍처가 좋지 않습니다. 단위 테스트는 불가능하거나 어렵 기 때문에 두 클래스를 확장 할 때 문제가 발생할 수 있습니다.
      • 두 클래스를 단단히 결합하지 않는 메커니즘을 선택하는 것이 좋습니다. 한 가지 옵션은 요청이 반환 될 때 실행되는onReturnAPIRequest()에 클로저를 전달하는 것입니다. 이 클로저는 들어오는 데이터를 처리하는 코드를 포함 할 수 있습니다. 또 다른 옵션은NotificationCenter를 사용하여 데이터를 뷰 컨트롤러에 전달하거나Database클래스를 사용하여 데이터를 처리하는 것입니다.

      싱글 톤 디자인 패턴은 오용하기 쉽기 때문에 약간의 논란을 불러 일으켰습니다. 싱글 톤을 사용할 때는 상태 및 종속성을 염두에 두십시오. 이 상태에 대한 글로벌 액세스 할 수 쉽게해서,그것은 좋은 생각 의미하지 않는다.

      을 얻으로 고용자

      를 구축하는 것을 배우십시오 iOS14 앱을 신속한 5

      내 iOS 개발 과정,그리고 시작하는 방법에 대해 알아보십시오 경력으로 전문 iOS 개발자이다.

      추가 읽기

      그리고 그게 전부입니다! 특히 앱 아키텍처 및 시스템 설계에 관심이 있는 경우 싱글톤을 알아가는 것은 가치있는 목표입니다.

답글 남기기

이메일 주소는 공개되지 않습니다.