카테고리에 대한 신속한 클래스를 만드는 방법은 무엇입니까?


84

기존 swift 클래스의 카테고리를 만들고 싶지만 IDE에 그렇게 할 수있는 옵션이 없습니다.

카테고리가 신속한 프로젝트에 존재하는지 여부를 알 수 있습니까? 아니면 신속한 프로젝트에서 유사한 기능을 달성하는 방법은 무엇입니까?


2
그것은 불렀다 extension.
holex 2014-06-10

답변:


128

Swift에서는 Extensions기존 클래스, 구조체 및 열거 유형에 새 기능을 추가 하는 데 사용할 수 있습니다.

주로 다음과 같은 몇 가지면에서 Objective-C 범주와 다릅니다.

  • 그들은 이름이 없습니다
  • 확장을 명시 적으로 가져올 필요는 없습니다. 확장을 정의하여 기존 유형에 새 기능을 추가하면 확장이 정의되기 전에 생성 된 경우에도 해당 유형의 모든 기존 인스턴스에서 새 기능을 사용할 수 있습니다.
  • 위에서 언급했듯이 클래스뿐만 아니라 다른 유형에서도 작동합니다.

현재 상태에서 Extensions는 다음을 수행 할 수 있습니다.

  • 계산 된 속성 및 계산 된 정적 속성 추가
  • 인스턴스 메서드 및 형식 메서드 정의
  • 새로운 이니셜 라이저 제공
  • 아래 첨자 정의
  • 새 중첩 유형 정의 및 사용
  • 기존 유형이 프로토콜을 준수하도록합니다.

확장을 선언하는 기본 구문은 다음과 같습니다.

extension SomeType {
    // new functionality to add to SomeType goes here
}

Swift에서 확장 기능을 사용하는 방법에 대한 자세한 정보는 Apple의 문서 를 확인하십시오 .


99

Objective C에서는 카테고리 라고 했지만 Swift에서는 확장 이라고 합니다 . 둘 다의 목적은 하위 클래스를 만들지 않고도 기존 클래스에 추가 기능을 제공하는 것입니다.

문서에서 확장에 대해 읽었지만 이 튜토리얼 비디오 ( YouTube 버전 , github 소스 )를보기 전까지는 프로젝트에서 확장 기능을 사용하는 방법을 이해하지 못했습니다 .

다음은이를 수행하는 방법에 대한 비디오에서 가져온 요약입니다.

프로젝트에 Swift 파일 추가

  • 프로젝트 네비게이터를 마우스 오른쪽 버튼으로 클릭하고 "새 파일 ..."을 선택합니다.

  • "Swift 파일"을 선택합니다.

  • 규칙은 파일 이름을 확장하려는 클래스 이름과 함께 수행중인 작업 ( "+"기호 사용)으로 저장하는 것입니다. 예 : "UIImage + Cropping".

확장에 대한 코드 작성

방금 만든 새 Swift 파일을 엽니 다.

을 확장하는 경우 UIKit(대신 Foundation) 가져와야 합니다 UIView. 그런 다음 extension확장하려는 클래스 이름 앞에 키워드를 사용하십시오 . 그런 다음 클래스에 고유 한 새 메서드를 추가 할 수 있습니다. (확장은 기존 메서드를 재정의하는 것이 아니라 새 메서드를 추가하기위한 것이므로 이름입니다.)

비디오에서 예제는 이미지에서 원을 자르고 테두리를 제공하는 방법을 추가하는 것입니다.

import UIKit

extension UIImage {
    
    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
        
        // code to create the cropped circle with colored border
        
        return newImage
    }
}

전체 예제는 여기 를 참조 하십시오 .

프로젝트의 어느 곳에서나 확장 사용

이제 표준 클래스의 일부인 것처럼 코드의 모든 위치에서 해당 클래스에 대한 새 메서드를 사용할 수 있습니다.

다음은 비디오의 예입니다 ( github ).

import UIKit
class ViewController: UIViewController {
                            
    @IBOutlet var imageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let img = imageView.image
        imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
    }
}

이 방법 cropToCircleWithBorderColor은의 표준 부분은 UIImage아니지만 보시다시피 예전처럼 사용됩니다.

추가 연구 :



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