목록분류 전체보기 (65)
develop
코코아팟 라이브러리 만들기 가이드: guides.cocoapods.org/making/making-a-cocoapod.html CocoaPods Guides CocoaPods is fully open-sourced, so it depends on community contributions to get better. If you're looking to start working on CocoaPods, this is the place to start. guides.cocoapods.org 라이브러리 프로젝트 만들기 터미널에서 pod lib create [라이브러리명] 을 입력을 한다. 플랫폼을 물어보는데 iOS라고 입력을 하고 언어를 물어보는데 Swift라고 입력을 했다. 그리고 데모 앱을 만들건지 물어보..
srt파일이나 smi파일안에 한글이 있다면 아래와 같이 한글이 깨져서 나오게 된다. let urlPath = "https://pikachu987.github.io/ProjectData/Playground/exampleSrt1.srt" guard let url = URL(string: urlPath) else { return } guard let data = try? Data(contentsOf: url) else { return } guard let attributed = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) else {..
코코아팟이 설치가 되어 있지 않으면 아래의 명령어를 터미널에 입력한다. $ sudo gem install cocoapods 프로젝트를 생성후 프로젝트 폴더에서 $ pod init 이란 명령어를 사용한다. 그럼 podfile이 생성이 되고 podfile을 텍스트편집기로 열어보면 이런 식의 구조가 만들어져 있을 것이다. 그럼 use_frameworks! 아래부터 pod ‘podName’ 이런식으로 적으면 된다. 이후에 저장하고 터미널로 $ pod install 이라고 입력하면 터미널에서 라이브러리들이 다운 받아지고 폴더 구조가 바뀐다. 그리고 .xcworkspace 을 실행시키면 라이브러리들이 포함된 프로젝트를 실행 할 수 있다. 라이브러리의 원하는 버전을 넣을 수 있고 pod 'NotificationVie..
Reorder기능은 셀을 터치한 다음 드래그로 셀의 위치를 바꾸는 기능이다. UITableView Reorder let tableView: UITableView = { let tableView = UITableView() return tableView }() var array: [UIColor] = [.blue, .red, .brown, .black, .green, .gray, .cyan, .orange, .darkGray, .lightGray, .link, .magenta, .purple, .yellow] override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(self.tableView) self.tableView.frame = s..
GCD(GrandCentralDispatch) 구현이 아주 간단하고 대부분 GCD 방식으로 사용하고 있다. 2021/01/18 - [iOS] - DispatchGroup 으로 GCD로 만든 것들을 그룹화 할 수도 있다. GCD는 Main큐와 Global큐가 시스템으로 만들어져 있다. 그리고 Queue를 직접 만들수 있다. DispatchQueue.main.async { print("main Queue isMainThread: \(Thread.isMainThread)") } DispatchQueue.global().async { print("global Queue isMainThread: \(Thread.isMainThread)") } let queue = DispatchQueue(label: "Custo..
작업 큐라는 방식이고 병렬프로그래밍을 하기위한 개념이다. 큐에 작업들을 넣으면 알아서 별도의 Thread에서 실행시켜 준다. let queue = OperationQueue() queue.addOperation { (0...3).forEach({ print("queue1: \($0)") }) } let operation = Operation() operation.completionBlock = { () in (0...3).forEach({ print("queue2: \($0)") }) } queue.addOperation(operation) queue1: 0 queue2: 0 queue2: 1 queue1: 1 queue2: 2 queue1: 2 queue2: 3 queue1: 3 간단하게는 Operat..
모든 언어에서 일반적으로 사용되는 병렬프로그래밍 기술인 멀티스레드 하지만 아래의 다른 병렬프로그래밍 기술보다 사용하기가 까다롭고 비효율적이다. Thread에는 Selector을 사용할수 있는 생성자와 block구문을 이용한 생성자가 있다. @available(iOS 2.0, *) public convenience init(target: Any, selector: Selector, object argument: Any?) @available(iOS 10.0, *) public convenience init(block: @escaping () -> Void) Selector을 사용하는 방법이다. override func viewDidLoad() { let thread1 = Thread(target: self..
let workItem = DispatchWorkItem { print("work Item") } workItem.perform() work Item 생성자에 block을 넣는다. perform 메서드로 block를 실행한다. let workItem = DispatchWorkItem { print("work Item") } workItem.notify(queue: DispatchQueue.main) { print("notify") } workItem.perform() work Item notify workItem이 끝나면 notify로 알림을 받을수 있다. let workItem = DispatchWorkItem { print("work Item") } let completeWorkItem = Dispa..
let example = [1,2,3,4,5,6].filter { (value) -> Bool in print("filter: \(value)") return value % 2 == 0 } let example1 = [1,2,3,4,5,6].lazy.filter { (value) -> Bool in print("lazy filter: \(value)") return value % 2 == 0 } filter: 1 filter: 2 filter: 3 filter: 4 filter: 5 filter: 6 lazy를 사용하지 않은 example은 filter가 동작이 된다. lazy를 사용한 example1는 lazy의 뜻에 알맞게 동작이 되지 않는다. let example = [1,2,3,4,5,6].fil..
저장 프로퍼티(Stored Property) struct Example { var value: String } 지연 프로퍼티(Lazy Property) struct Example { lazy var value: String = "" } let example = Example() value에 접근하기 전까지 value는 메모리에 올라가지 않는다. lazy는 let이 될수 없다. let으로 선언된 변수는 초기에 값이 있어야 하는데 lazy는 초기에 값이 존재하지 않고 접근시 값이 생기는 것이라 let을 사용할 수 없다. 만약 변수가 클로저로 되어서 스스로를 참조하면 캡쳐리스트로 메모리 누수를 방지 해야 한다. class Example { var value = "" lazy var closure: () -> ..
KVC는 Key-Value Coding의 약자이다. Swift3에서는 #keyPath()로 키패스를 가져왔지만 Swift4에서는 \만 적어주면 키패스를 가져올수 있게 되었다. class Example: NSObject { var value: String = "" } print(\Example.value) Swift.ReferenceWritableKeyPath 수정도 간단하다. class Example: NSObject { var value: String = "HI" } let example = Example() print(example[keyPath: \Example.value]) example[keyPath: \Example.value] = "HELLO" print(example[keyPath: \Ex..
== 는 비교 연산자로 많이 사용이 되고 인스턴스의 값이 같은지 비교를 한다. 비교 연산자에서 =을 하나 더 붙인 === 연산자가 있는데 이 연산자는 인스턴스의 참조가 같은지 즉, 주소값이 같은지 비교를 한다. class Example { var value: Int? } let example1 = Example() let example2 = Example() let example3 = example1 print("example1 === example2: \(example1 === example2)") print("example1 === example3: \(example1 === example3)") example1 === example2: false example1 === example3: true e..
struct나 protocol 확장 에서 self 변수를 참조해 수정하려면 mutating을 써야 한다. protocol ExampleProtocol { var value: Int? { set get } } extension ExampleProtocol { mutating func exampleFunc() { self.value = 5 } } struct Example1 { var value: Int? mutating func exampleFunc() { self.value = 5 } } struct에서 변수의 값이 변경되면 struct 전체가 복사되고 주소값이 변경이 된다. 값이 변경될 때 struct가 복사되는 이유는 swift가 함수형 언어이고 불변성이 중요한 요소라서 전체가 복사가 되고 주소값이 ..
class Example1 { var value: Int? required init(value: Int?) { self.value = value } } Required를 init앞에 붙이면 필수로 init을 상속받은 곳에서 구현해야 한다. 그리고 반드시 override되어 야 하므로 override를 붙이지 않고 required를 붙여준다. class Example2: Example1 { required init(value: Int?) { super.init(value: value) } } protocol에서 init를 사용하면 자동으로 required가 된다. protocol ExampleProtocol { init() } class Example: ExampleProtocol { required in..