관리 메뉴

HAMA 블로그

iOS 스위프트(Swift) 개발을 위한 라이브러리 TOP 10 [번역] 본문

아이폰 (IOS)

iOS 스위프트(Swift) 개발을 위한 라이브러리 TOP 10 [번역]

[하마] 이승현 (wowlsh93@gmail.com) 2016. 11. 17. 14:21


iOS Swift 개발을 위한  라이브러리 TOP 10 

스위프트의 인기가 높아지면서 새 프로젝트를 시작할때 스위프트를 사용할 기회 또한 많아지고 있다.
시간도 절약하고 좀 더 쉽게 스위프트로 iOS 개발을 하기위해 여기 10가지 라이브러리를 소개하고자 한다. 

이전에 언급한  GitHub 와 Bitbucket 는 훌륭한 iOS 라이브러리를 찾기 위한 좋은 장소이다.
CocoaPods 나 Carthage 같은 툴은 라이브러리를 신속하게 인스톨링하고 관리하는데 도움을 줄 수 있다.
이 방식은 프로젝트 디펜던시를 관리하는것을 쉽게 만들어 줄 것이다.

Top 10 Swift libraries

1. Alamofire

앱에 네트워킹을 위한 기능을 간단히 추가하고 싶을때, Alamfire 는 안성마춤이다.Alamofire  는 HTTP 네트워킹 라이브러리이고 NSURLSession 과 Foundation URL 로딩 시스템에 기반해서 만들어졌다. 우아하고 간단한 스위프트 인터페이스로 네트워킹 메카니즘을 깔끔하게 감쌌다.


// Making a GET request

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
         .responseJSON { response in
             print(response.request)  // original URL request
             print(response.response) // URL response
             print(response.data)     // server data
             print(response.result)   // result of response serialization

             if let JSON = response.result.value {
                 print("JSON: \(JSON)")
             }
         }

2. SwiftyJSON

Swift의 명시적 유형은 코드로 인한 실수를 저지르지 않게 도와주어  버그가 발생하지 않도록 합니다. 그러나 때로는 JSON을 사용하여 작업 할 때 특히 문제가 될 수 있습니다. 다행스럽게도 SwiftyJSON은 Swift의 JSON 데이터를 보다 읽기 쉬운 방식으로 처리하는 데 도움이됩니다. 선택적 언 래핑은 자동으로 처리됩니다!


// Typical JSON handling

if let statusesArray = try? NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as? [[String: AnyObject]],
    let user = statusesArray[0]["user"] as? [String: AnyObject],
    let username = user["name"] as? String {
    // Finally we got the username
}

// With SwiftyJSON

let json = JSON(data: dataFromNetworking)
if let userName = json[0]["user"]["name"].string {
  //Now you got your value
}

SwiftyJSON 는 Alamofire 와 함께 할 때 빛이 나죠.

Alamofire.request(.GET, url).validate().responseJSON { response in
    switch response.result {
    case .Success:
        if let value = response.result.value {
          let json = JSON(value)
          print("JSON: \(json)")
        }
    case .Failure(let error):
        print(error)
    }
}

3. ObjectMapper

API를 통해 정보를 다운로드하는 앱을 작성한 적이 있다면 아마도 응답을 객체에 매핑하는 코드를 작성하는 데 많은 시간을 할애했을 것입니다. ObjectMapper를 사용하면 JSON 응답을 모델 객체로 변환하거나 그 반대로 변환 할 수 있습니다. 즉, JSON을 객체에 매핑하고 객체를 JSON에 매핑하는 데 도움이됩니다. 중첩 된 객체도 지원됩니다.


// Temperature class that conforms to Mappable protocol

struct Temperature: Mappable {
    var celsius: Double?
    var fahrenheit: Double?

    init?(_ map: Map) {

    }

    mutating func mapping(map: Map) {
        celsius     <- map["celsius"]
        fahrenheit  <- map["fahrenheit"]
    }
}

또한 ObjectMapper를 사용할 때 JSON 응답 데이터를 Swift 객체로 변환하는 AlamofireObjectMapper라는 Alamofire 확장 기능에 대해서도 언급 할 가치가 있습니다.

4. Quick

Quick는 RSpec, Specta 및 Ginkgo에서 영감을 얻은 Swift의 행동 중심 개발 프레임 워크입니다. Quick는 Nimble과 함께 제공됩니다. Nimble은 테스트를 위한 matcher 프레임 워크입니다.

// Documentation directory spec

class TableOfContentsSpec: QuickSpec {
  override func spec() {
    describe("the 'Documentation' directory") {
      it("has everything you need to get started") {
        let sections = Directory("Documentation").sections
        expect(sections).to(contain("Organized Tests with Quick Examples and Example Groups"))
        expect(sections).to(contain("Installing Quick"))
      }

      context("if it doesn't have what you're looking for") {
        it("needs to be updated") {
          let you = You(awesome: true)
          expect{you.submittedAnIssue}.toEventually(beTruthy())
        }
      }
    }
  }
}

5. Eureka

Eureka는 간단하고 우아한 방식으로 동적 테이블 뷰 형식을 작성할 수 있도록 도와줍니다. 그것은 행, 섹션 및 양식으로 구성됩니다. 앱에 많은 양식이 포함되어있는 경우, 유레카 (Eureka)는 실시간 보호 기능을 입증합니다.

// Creating a form

class CustomCellsController : FormViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        form +++ Section("Custom cells")
                    <<< WeekDayRow(){
                        $0.value = [.Monday, .Wednesday, .Friday]
                    }
                    <<< TextFloatLabelRow() {
                        $0.title = "Float Label Row, type something to see.."
                    }
    }
}

6. RxSwift

RxSwift는 Functional Reactive Programming을위한 신속한 프레임 워크입니다. 보다 구체적으로, RxSwift는 Rx의 신속한 버전이며 목표는 비동기 작업과 이벤트 / 데이터 스트림을 쉽게 구성 할 수있게하는 것입니다. KVO 관찰, 비동기 작업 및 델리게이트는 모두 시퀀스 추상화로 통일되어 RxSwift를 강력한 프레임 워크로 만듭니다. ReactiveCocoa를 사용해 본 경험이 있다면 그 개념을 잘 알고있을 것입니다.

// Combine first and last name sequences, and bind the resulting string to label

combineLatest(firstName.rx_text, lastName.rx_text) { $0 + " " + $1 }
            .map { "Greeting \($0)" }
            .bindTo(greetingLabel.rx_text)

7. SnapKit

SnapKit은 가독성을 잃지 않으면 서 최소한의 코드만으로 자동 레이아웃을 코드에 작성하는 것을 단순화하는 자동 레이아웃 라이브러리입니다. 사용자 인터페이스를 코딩하는 동안 프로그래밍 오류를 피할 수 있도록 설계된 유형 안전타입입니다.

// Resizing and centering subview in its superview

let box = UIView()
let container = UIView()

container.addSubview(box)

box.snp_makeConstraints { (make) -> Void in
    make.size.equalTo(50)
    make.center.equalTo(container)
}

8. Spring

Spring은 코드에서 또는 스토리 보드에서 직접 애니메이션을 생성하는 데 도움이되는 애니메이션 라이브러리입니다. 런타임 속성을 사용하여 스토리 보드에서 애니메이션을 만들 수 있습니다 (IBInspectable 속성을 통해 설정). Spring은 많은 이미 작성된 애니메이션, 전환 및 속성을 지원하는 완전히 개발 된 애니메이션 라이브러리로 성장했습니다.

// Usage with code

layer.animation = "wobble"
layer.animate()

9. Kingfisher

Kingfisher는 웹에서 이미지를 다운로드하고 캐시하기위한 경량 라이브러리입니다. 다운로드 및 캐싱은 비동기 적으로 수행됩니다. 다운로드 한 이미지는 메모리와 디스크 모두에 캐시되므로 앱 환경이 상당히 향상 될 수 있습니다.

// Basic example of downloading and caching an image

imageView.kf_setImageWithURL(NSURL(string: "http://your_image_url.png")!)

10. CoreStore

CoreStore는 Core Data의 래퍼 라이브러리입니다. 그 목표는 핵심 데이터와 상호 작용할 때 유형 안전성과 Swift의 우아함을 제공하는 것입니다. CoreStore의 API는 데이터베이스와 효과적으로 상호 작용하는 모든 일반적인 방법을 제공합니다.

// Storing a person entity

CoreStore.beginAsynchronous { (transaction) -> Void in
    let person = transaction.create(Into(MyPersonEntity))
    person.name = "John Smith"
    person.age = 42

    transaction.commit { (result) -> Void in
        switch result {
            case .Success(let hasChanges): print("success!")
            case .Failure(let error): print(error)
        }
    }
}


Comments