実録! 2年半ぶりのSwiftアプリバージョンアップ 2日目 その1

おはようございます。続きです。

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var y = newYStart; y <= newYEnd; y += 1 {
【修正後】
for y in newYStart … newYEnd { // 3.1
【解説】
Swift 3.0で for ループの構文が変わりました。影響はとても大きいですが、記述が簡潔になりました。英断でしたね。個人的にはそのままにして欲しかった・・・

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var xi = 1; xi <= xNum; xi += 1 {
【修正後】
for xi in 1 … xNum { // 3.1
【解説】
同じ

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var yi = 1; yi <= yNum; yi += 1 {
【修正後】
for yi in 1 … yNum { // 3.1
【解説】
同じ

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var i = 0; i < gs.m_touches.count; i++ {
【修正後】
for i in 0 ..< gs.m_touches.count {
【解説】
“以下”の場合は … で、”未満”の場合は ..< です。 【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var xi = gs.m_glass.enable() ? 8 – gs.m_glass.xV % 8 : 0; xi <= xNum; xi += 8 {
【修正後】
for xi in stride(from: (gs.m_glass.enable() ? 8 – gs.m_glass.xV % 8 : 0), through: xNum, by: 8) { // 3.1
【解説】
飛び石パターンです。throughが”以下”、toが”未満”です。このパターンはもう1箇所ありました。

【エラーメッセージ】
C-style for statement has been removed in Swift 3
【修正前】
for var x:CGFloat = (bPlusX ? start.x + unitX : start.x – unitX);
(bPlusX ? x < end.x : end.x < x);
x += (bPlusX ? unitX : -unitX) {
// 処理
}
【修正後】
if (bPlusX) {
for x : CGFloat in stride(from: start.x + unitX, to: end.x, by: unitX) {
// 処理
}
} else {
for x : CGFloat in stride(from: end.x, to: start.x – unitX, by: unitX).reversed() {
// 処理
}
}
【解説】
時間かかりました・・・
事前に条件分岐して2つのforループに分けるしかない・・・よね?全体として記述が長くなってしまったパターンです。複雑なforループは書くべきじゃないということか・・・このパターンはもう1箇所ありました。

【エラーメッセージ】
Use of unresolved identifier ‘countElements’
【修正前】
countElements(target)
【修正後】
target.characters.count
【解説】
変数targetはString型です。文字の長さ取得だけで、結構手間ががかります。charactersは、見た目の文字数を取得します。

【エラーメッセージ】
‘Default’ has been renamed to ‘default’
【修正前】
UIAlertActionStyle.Default
【修正後】
UIAlertActionStyle.default
【解説】
Defaultの先頭大文字が小文字に変わっただけ。合計3箇所ありました。

【エラーメッセージ】
Cannot convert value of type ‘String’ to expected argument type ‘UnsafeMutableRawPointer’
【修正前】
if let path = Bundle.main.path(forResource: file as String, ofType: “sks”) {
var sceneData = Data(bytesNoCopy: path, count: .DataReadingMappedIfSafe, deallocator: nil)!
【修正後】
if let path = Bundle.main.path(forResource: file as String, ofType: “sks”) {
let pathURL : URL = URL(fileURLWithPath: path)
var sceneData : Data
do {
sceneData = try Data(contentsOf: pathURL, options: .mappedIfSafe)
} catch {
print(“unarchiveFromFile error.”)
}
【解説】
結構変わるなあ・・・

【エラーメッセージ】
‘init(forReadingWithData:)’ has been renamed to ‘init(forReadingWith:)’
【修正前】
var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
【修正後】
var archiver = NSKeyedUnarchiver(forReadingWith: sceneData)
【解説】
ラベル名が変わっただけ。

【エラーメッセージ】
‘Any?’ is not convertible to ‘GameScene’; did you mean to use ‘as!’ to force downcast?
【修正前】
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
【修正後】
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
【解説】
ダウンキャストは必ず成功する想定なので、as! で強制的にキャストして対処します、が、いつからこのエラー出るようになったんですかね?

【エラーメッセージ】
Argument labels ‘(data:)’ do not match any available overloads
【修正前】
var data: Data = Data(data:UIImagePNGRepresentation(image))
【修正後】
var data: Data = UIImagePNGRepresentation(image)!
【解説】
UIImagePNGRepresentationから直接Dataを取得可能になったようです。いつ頃変わったんだろう・・・

・・・続く

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です