[Swift] GCD関連 [Swift4対応]

  • キューの作成

(Swift2まで)

let queue1 = dispatch_queue_create("arrayQ", DISPATCH_QUEUE_SERIAL)
let queue2 = dispatch_queue_create("arrayQ", DISPATCH_QUEUE_CONCURRENT)

(Swift3以降)

let queue1 = DispatchQueue(label: "arrayQ")
let queue2= DispatchQueue(label: "arrayQ", attributes: .concurrent)

(Swift2まで)

let queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
let queue4 = dispatch_get_main_queue()

(Swift3以降)

let queue3 = DispatchQueue.global(qos:DispatchQoS.QoSClass.background)
let queue4= DispatchQueue.main
  • グループの作成

(Swift2まで)

let group = dispatch_group_create()

(Swift3以降)

let group = DispatchGroup()
  • グループのwait

(Swift2まで)

dispatch_group_wait(group, dispatch_time_t(DISPATCH_TIME_FOREVER))

(Swift3以降)

group.wait(wallTimeout: .distantFuture)
  • 同期処理

(Swift2まで)

dispatch_sync(queue, {() in
...
}

(Swift3以降)

queue.sync {() in
...
}
  • 非同期処理

(Swift2まで)

dispatch_async(queue, {() in
...
}

(Swift3以降)

queue.async {() in
...
}

(Swift2まで)

dispatch_barrier_async(queue, {() in
...
}

(Swift3以降)

queue.async(flags: .barrier) {() in
...
}
  • セマフォ宣言

(Swift2まで)

let semaphore:dispatch_semaphore_t

(Swift3以降)

let semaphore:DispatchSemaphore
  • セマフォの作成

(Swift2まで)

semaphore = dispatch_semaphore_create(Int)

(Swift3以降)

semaphore = DispatchSemaphore(value: Int)
  • セマフォのwait

(Swift2まで)

if (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) == 0) {
...
}

(Swift3以降)

if (semaphore.wait(timeout:.distantFuture) == .success) {
...
}
  • セマフォのsignal

(Swift2まで)

dispatch_semaphore_signal(semaphore)

(Swift3以降)

semaphore.signal()

[Swift][Error]Argument labels ‘(_:)’ do not match any available overloads

・エラーメッセージ
Argument labels ‘(_:)’ do not match any available overloads

・エラー例

let num = 3
var nsnum = NSNumber(num)
// => Argument labels ‘(_:)’ do not match any available overloads


・原因
メソッドに必要なラベルが存在しないために発生します

“[Swift][Error]Argument labels ‘(_:)’ do not match any available overloads” の続きを読む

[Swift] Swift3でArrayにremoveObjectを実装する

NSArrayにはremoveObjectというインデックスではなくオブジェクトを指定して配列内の該当する要素を削除するメソッドがあります。

同じものがSwiftのArrayにもあるかと思ったのですが無く困ってましたが、以下のようにextensionを使ってArrayを拡張すれば対応可能になります。

“[Swift] Swift3でArrayにremoveObjectを実装する” の続きを読む

[Swift][Error] Value of type ‘[*]’ has no member ‘*’

・エラーメッセージ
Value of type ‘[*]’ has no member ‘*’

・エラー例

var x:[Int] = [1,2,3]
if x.containsObject(2) {
    print(“x contains 2”)
}
// => Value of type ‘[Int]’ has no member ‘containsObject’


・原因
存在しないメソッドや変数を利用しようとした場合に発生する。

“[Swift][Error] Value of type ‘[*]’ has no member ‘*’” の続きを読む

[Swift][Error] Cannot assign value of type ‘[AnyObject]’ to type *

・エラーメッセージ
Cannot assign value of type ‘[AnyObject]’ to type *

・エラー例

var x:[Int]
var y:[AnyObject] = [1,2,3]
x = y
// => Cannot assign value of type ‘[AnyObject]’ to type ‘[Int]’


・原因
上記の場合、AnyObject型のコレクション(配列や辞書)をInt型のコレクションに格納しようとしたため

“[Swift][Error] Cannot assign value of type ‘[AnyObject]’ to type *” の続きを読む

[Swift][Error] Can’t convert value of type * to expected argument type *

・エラーメッセージ
Can’t convert value of type * to expected argument type *

・エラー例

var y:Double
var x:Int = 10
y = 10 + x
// => Can’t convert value of type ‘Int’ to expected argument type ‘Double’


・原因
上記の場合、Double型の変数にInt型の数値を格納しようとしたため

“[Swift][Error] Can’t convert value of type * to expected argument type *” の続きを読む