ハッカソンに使うswift & swift 3.0のgcd
TRANSCRIPT
歌舞伎座.tech#11 Swiftプログラミング勉強会
LT(3)
Who am I?
MAGES. Inc. Game Div.
iOS Developer
@lovee
ハッカソン GCD
ハッカソンに使う Swiftハッカソンはいいぞ。
ハッカソン知らない人?
ハッカソン参加したことある人?
ハッカソンで賞取ったことある人?
ハッカソンに必要なもの十分に速いマシン • the New MacBook でも十分
信頼できる仲間 •仲間、大事。とても大事
効率高いアウトプット •24時間前後しか時間がない
折れない心←これ重要 •ハッカソンにハプニングはつきもの
効率高いアウトプット
開発開始前のコーディングは禁止
OSS の Library や Framework は利用可
そうだ、自分の Framework を作ろう。
Swift の特徴
Extension 対応による高い拡張性
普段自分がよく使うメソッドを Framework にまとめちゃおう
var id = UIDevice.current.identifierForVendor?.description ?? “"
let remainingIndex = id.characters.index(id.startIndex, offsetBy: 8, limitedBy: id.endIndex) ?? id.endIndex
id = id.substring(to: remainingIndex)
var id = UIDevice.current.identifierForVendor?.description ?? “"
id.keepFirst(8)
// Extension extension String { public func keepingFirst(_ n: Int = 1) -> String { let remainingIndex = self.characters.index(self.startIndex, offsetBy: n, limitedBy: self.endIndex) ?? self.endIndex return self.substring(to: remainingIndex) } }
extension String { public mutating func keepFirst(_ n: Int = 1) { self = self.keepingFirst(n) } }
var array = [Int](0 ..< 5) //[0, 1, 2, 3, 4]
あれ? シャッフルって
どうやるんだっけ?
var array = [Int](0 ..< 5) //[0, 1, 2, 3, 4]
// Fisher-Yates Shuffle Algorithm for i in array.indices.reversed().dropLast() { let j = Int(arc4random_uniform(UInt32(i))) (array[i], array[j]) = (array[j], array[i]) } //[1, 4, 0, 2, 3]
extension Array { public var shuffled: Array<Element> { var array = self for i in array.indices.reversed().dropLast() { let j = Int(arc4random_uniform(UInt32(i))) (array[i], array[j]) = (array[j], array[i]) } return array } public mutating func shuffle() { self = self.shuffled } }
var array = [Int](0 ..< 5) //[0, 1, 2, 3, 4] array.shuffle() //[1, 4, 0, 2, 3]
https://github.com/el-hoshino/Eltaso
Thank you
Swift 3.0 の GCD今までの GCD の歴史の中で最大のリリース
GCD(dispatch_…)を知らない人?
今まで…
同期処理/非同期処理 dispatch_sync(<#dispatch_queue_t#>, <#() -> Void#>) dispatch_async(<#dispatch_queue_t#>, <#() -> Void#>)
メインキュー/グローバルキュー dispatch_get_main_queue() dispatch_get_global_queue(<#Int#>, <#UInt#>)
セマフォ dispatch_semaphore_create(<#Int#>) dispatch_semaphore_signal(<#dispatch_semaphore_t#>) dispatch_semaphore_wait(<#dispatch_semaphore_t#>, <#dispatch_time_t#>)
これから
DispatchObject で処理することに DispatchQueue DispatchSemaphore DispatchTime DispatchWorkItem …
let imageView = UIImageView() let image = UIImage()
//...
dispatch_async(dispatch_get_main_queue()) { imageView.image = image }
let imageView = UIImageView() let image = UIImage()
//...
DispatchQueue.main.async { imageView.image = image }
let semaphore = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) { //Data Downloading... dispatch_semaphore_signal(semaphore) }
let waitTime = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC) * 60) if dispatch_semaphore_wait(semaphore, waitTime) == 0 { print(“Succeeded") } else { print("Failed") }
let semaphore = DispatchSemaphore(value: 0)
DispatchQueue.global().async { //... semaphore.signal() }
let waitTime = DispatchTime.now() + DispatchTimeInterval.seconds(60) if semaphore.wait(timeout: waitTime) == .success { print("Succeeded") } else { print("Failed") }
let semaphore = DispatchSemaphore(value: 0)
DispatchQueue.global().async { //... semaphore.signal() }
let waitTime = DispatchTime.now() + .seconds(60) if semaphore.wait(timeout: waitTime) == .success { print("Succeeded") } else { print("Failed") }
詳しくは https://developer.apple.com/reference/dispatch まで
dispatch_once はお亡くなりに…代わりに static lazy var などを活用しろとのこと
Thank you