Search

[라이브러리 정리] 라이브러리 쪼개보기 - Charts

다른 분들이 멋지게 공유해주셨기에 저도 화답하는 마음으로 공유 글을 썼습니다
contents

Charts

사용자들이 쉽게 차트를 만들 수 있도록 돕는 라이브러리입니다. 다양하게 쓸 수 있는 차트 형식이 많아서 쓰기 좋습니다.

훑어보기

Charts안에서 제공해주는 차트는 총 8개입니다.(8 different chart types)
총 8개의 차트들은 각각의 ChartRenderer ChartView DataSet ChartData Highlighter 등을 파일로 가지게 됩니다.
Render: 모든 Chart Render의 부모 파일입니다. Chart들은 Render를 상속받아서 사용합니다. Render에는 기본적으로 Handler가 존재하는데, 이 친구가 전체적인 Chart를 그려주는 역할을 합니다.또한 Animator를 가지고 있어서 Charts에 전반적인 애니메이션을 다룹니다.
ChartView : ChartView의 경우에는 기본적으로 상속받고 있는 class들이 많습니다. ChartViewBase, Provider, GestureDelegate등을 다양하게 상속받고 있어요. 기본적인 Chart의 View를 보여주는 부분이다보니 그런 것 같습니다.
DataSet : IChartDataSet Protocol에 기반을 두고 있습니다. 밑에 있는 ChartData들이 Chart에 나타날 때에 각각 데이터들의 기본 UI설정과 데이터 관리를 맡고 있습니다. 색상이라던지 Shadow 등을 그리기도 하고 DataSet에 들어있는 값들을 remove, add, contain하는 일을 합니다.
ChartData: 모든 Chart들은 ChartData라는 파일을 상속 받습니다. 내부에는 들어오는 ChartData를 사용해서 Max, Min값을 알아내거나 Data를 그리기, Data Label 쓰기 등에 일을 실행합니다.
Highlighter : IHighlighter Protocol의 상속을 받고 있습니다. touch한 Position의 x, y값을 가져와서 해당 부분을 Highlight해주는 일을 합니다.

CoreGraphics

CoreGraphics는 Charts안에 있는 파일들이 대부분 import하고 있는 라이브러리입니다.
아마 이런 이름들 들어보지 않았나요?
CGFloat
CGAffineTransform
CGColor
CGGradient
CGLayer
CGPath
CGPoint
...
이 친구들이 CoreGraphics안에 포함되어 있는 친구들입니다.
Charts 내부에서 차트를 그리기 위해선 Point, Path 등이 자주 필요하기 때문에 Import해서 사용하는듯 합니다. 또한 CG라이브러리들이 가지고 있는 함수들을 가져와서 쓰는 경우가 많더라구요. 그런 이유에서 Charts에겐 빼놓을 수 없는 라이브러리인 것 같습니다.

Separation

Charts 자체가 실행하는 과정이,
1. Data를 가지고 와서 2. ChartView에다가 생성한 후에 3. Animation를 원한다면 Animation를 넣어주고 4. 실행해준다.
Swift
복사
이기 때문에 해당 과정대로 파일들을 잘 분리해뒀습니다.
1.
Data를 가지고 와서
Charts에서 가장 잘 보여줘야 하는 부분이 데이터이기 때문에 데이터에 관한 파일도 많습니다.
ChartData
ChartDataSet
ChartDataEntry
ChartDataProvider
DataApproximator
2.
ChartView에다가 생성한 후에
a.
ChartView에 UI생성을 돕는 파일
ChartViewBase
DataRendererBase
ChartLimitLine
MarkerView
ChartColorTemplates
b.
ChartView에 도움을 주는 파일
ChartDataProvider
ChartUtils
3.
Animation를 넣어주고
Animator
AnimatedMoveViewJob
AnimatedViewPortJob
AnimatedZoomViewJob
4.
실행해준다.
ZoomViewJob
ViewPortJob
Transformer

문법

라이브러리는 볼 때마다 새로운 문법이 가득합니다.
앱과는 다르게 사람들이 가져다가 사용을 해야하는 라이브러리의 목적에 맞게 코드가 구성이 되어 있습니다.
// This defines a viewport modification job, used for delaying or animating viewport changes @objc(ChartViewPortJob) open class ViewPortJob: NSObject { internal var point: CGPoint = CGPoint() internal weak var viewPortHandler: ViewPortHandler? internal var xValue: Double = 0.0 internal var yValue: Double = 0.0 internal weak var transformer: Transformer? internal weak var view: ChartViewBase? @objc public init( viewPortHandler: ViewPortHandler, xValue: Double, yValue: Double, transformer: Transformer, view: ChartViewBase) { super.init() self.viewPortHandler = viewPortHandler self.xValue = xValue self.yValue = yValue self.transformer = transformer self.view = view } @objc open func doJob() { fatalError("`doJob()` must be overridden by subclasses") } }
Swift
복사
@objc가 왜이렇게 붙어있지 싶었습니다. 그리고 저런식으로 class 위쪽에다가 @objc를 사용하는 경우는 처음이었기 때문에 한 번 찾아봤습니다.

@objc

우리가 자주 사용하는 이 친구는 objective-c의 접근이 가능하게 해주는 inference입니다.
위에서는 왜 @objc를 붙였나요?

#if #endif

컴파일 이전에 미리 처리되는 문장인 전처리문입니다.
#if canImport(UIKit) import UIKit #endif #if canImport(Cocoa) import Cocoa #endif
Swift
복사
아마 C, C++를 하면서 #include <stdio.h> 많이 해보시지 않았나요. #define PI 3.14로 상수 정의해본 적 있지 않나요?
바로 그 # 입니다.
iOS에서 개발하다가 쓰는 경우
1.
release와 debug 구분
#if DEBUG print("DEBUG 코드") #endif
Swift
복사
2.
OS 구분
a.
Swift
#if os(iOS) print("ios에서만 할 코드") #elseif os(macOS) print("macOS에서만 할 코드") #elseif os(watchOS) print("wathOS에서만 할 코드") #endif
Swift
복사
b.
Objective-C
#if TARGET_OS_IPHONE // iOS 디바이스 혹은 시뮬레이터 #else // OSX 등등 #endif
Swift
복사
TARGET_OS_MAC
TARGET_OS_IPHONE: iOS 디바이스 혹은 시뮬레이터
TARGET_IPHONE_SIMULATOR: iOS 시뮬레이터
TARGET_OS_EMBEDDED: iOS 디바이스
전처리문 사용을 위한 Build Setting

접근제한자

전에 접근제한자에 대한 글을 쓴 적이 있어서 첨부합니다.