投稿

Swiftの廃止になったコンパイルエラー

公開しても特にメリットがあるものではないが、間違えて公開を押してしまった。

Prefix/Postfix '***' is reserved 前置/後置演算子の***は予約されています 【出現ver】Swift 2.1
【非出現ver】Swift 3.1
【このコンパイルエラーに変更になりました】'***' must have consistent whitespace on both sides

var abc =5 //エラー var def= 10 //エラー 決められた正しい使われ方をしていない。
=の前後のスペースの取り方が統一されてない。開けるなら左右とも開ける、閉じるなら左右とも閉じる。



All stored properties of a class instance must be initialized before returning nil from an initializer イニシャライザからnilで返る前に、クラスインスタンスの全てのストアドプロパティを初期化しないといけない 【出現ver】Swift 2.1
【非出現ver】Swift 3.1

class ClassA { var a: String init?(a: String?) { if a == nil { return nil //エラー } self.a = "" } }Swift 3.1ではエラーにならなかった。仕様変更か。



Cannot assign to 'let' value '〜' letで宣言した定数に値を代入しようとした 【出現ver】Swift 2.1より前
【非出現ver】Swift 2.1
Cannot assign to value: '***' is a 'let' constantに変更になった



Cannot assign to immutable value of type '***' 変更できない型'***'に代入できません 【出現ver】Swift 2.1より前
【非出現ver】Swift 2.1
他のメッセージに変更になっ…

iOS10.3 で MPMusicPlayerController クラスの挙動が変わった

デバイスをiOS10.3にアップデートしたら自作の音楽再生アプリでバグが発生しました。選んだ曲と別のものが再生されるバグです。

はじめにこの問題について述べる前にMPMusicPlayerControllerクラスのことを軽く書きます。
デバイスに入っている音楽を自作アプリ内で流すとき、曲のリストを取得してMPMusicPlayerControllerクラスのインスタンス(この記事ではこれをPlayerと呼ぶことにします)にセットします。その後、Playerに対して曲の再生、停止などの指令を出します。

//.h MPMusicPlayerController *iPodMusicPlayer; MPMediaQuery *albumsQuery; MPMediaItemCollection *selectedAlbumCollection;
//.m iPodMusicPlayer = [MPMusicPlayerController systemMusicPlayer]; //Playerの作成 albumsQuery = [MPMediaQuery albumsQuery]; //アルバム単位で情報を取得 selectedAlbumCollection = [albumsQuery.collections objectAtIndex:6]; //6のアルバムの情報を取得 [iPodMusicPlayer setQueueWithItemCollection:selectedAlbumCollection]; //取得した6のアルバムの情報をPlayerにセット [iPodMusicPlayer play]; //再生指令
Playerの作成するときは
systemMusicPlayerapplicationMusicPlayerのいずれかで作成します。

ここから今回の問題についてです。
何パターンかの操作を行うことで問題の症状を細かく炙り出しました。

症状1曲の再生を停止すると、Playerに設定した曲のリストが無効になる。(再設定が必要。)
Playerに対するstop指令で失う。pause指令では失わない。

曲のリストを失ったら、次に再生する前にリストを設定し直します。新たにMPMediaQueryから曲のリストを取得して設定すればOKです。

症状2いち…

センター試験英語 2017

今年は172点。
時間はぎりぎり。もう少し読解スピードが上がると確認に時間を取れるようになる。
前半を間違えるのはいいけど、後半の間違いはくやしい感じ。

Xcode 8.2 はシミュレータでスクリーンショットを撮ると落ちる on El Capitan

El Capitan 上の Xcode 8.2 は、シミュレータに付いているスクリーンショット撮影機能(File -> Save Screen Shot)を使うと落ちます。厳密に言うと1回目はOKで2回目に落ちる。

対策は
シミュレータで、Edit -> Copy Screen
Previewで、File -> New from Clipboard
手間もそんなに変わりません。

stackoverflowの記事(英語)

libswiftCore.dylibをロード出来ない問題

証明書はXcodeで自動で作成するようになったので、キーチェーンアクセスからappleの名前のものを手当たり次第削除して、Xcodeで一から作成したところ、アプリがシミュレータでは動作出来るのに、実機で実行できない問題にあたりました。Xcode 8.1です。
dyld: Library not loaded: @rpath/libswiftCore.dylib
というエラーが出ます。

ググったらキャッシュをクリーンさせる系の解決策もありましたが状況は変わらず。
最終的に
http://developer.apple.com/certificationauthority/AppleWWDRCA.cer
をダウンロードすることで解決しました。(プロジェクトのクリーンもやったかも)
https://forums.developer.apple.com/thread/21292
に書かれています。
このAppleWWDRCA.cerが何をするものかはわかりません。

No Common Blocks - Xcode 8から起こりがちなリンクエラー

Build SettingにあるNo Common BlocksというものがXcode 8からデフォルトでOnの模様。古いプロジェクトを初めてXcode 8で開くときに出てくる、コンパイラ設定変更の警告に従うとOnにされる。

これがOnだとObjective-Cのプロジェクトで、例えば
あるヘッダーでグローバル変数を定義している(例 : int a; )そのヘッダーが2箇所以上から#importされる の条件でリンクエラーを起こします。
externで回避しました。

ヘッダー側はextern int a;実装側でint a;
externの説明は他を参照して下さい。

検索用
Xcode 8
No Common Blocks
Apple Mach-O Linker Error
Linker command failed with exit code 1 (use -v to see invocation)
Message from debugger: Terminated due to signal 15

Swift 3.0でStringはどうなったか

前回Swift2.0のStringの仕様を調べたが、編集系(append, insert, remove, replace)のメソッドの仕様は整理しきれていない、というくやしい終わり方をした。
Swift 2.0でStringはどうなったか - 特殊文字などの扱い

今回はまず、この編集系メソッドから見ていく。
編集系メソッドの引数に与えるものは主にCharacterとStringであるが 、そのほかにCharacterを要素にもつシーケンスというものがある。これは、名前がSとして
<S : Sequence where S.Iterator.Element == Character>という性質を持つ。ここではこれを「Characterシーケンス」ということにする。

append(連結)系Swift2.0ではメソッド名がバラバラだったものが、めでたくappendに統一された。
CharacterやStringの場合は引数ラベルなしで与える。
Characterシーケンスの場合はラベルにcontentOfが付けられる。
mutating func append(_ c: Character)mutating func append(_ other: String)mutating func append<S : Sequence where S.Iterator.Element == Character>(contentsOf newElements: S)
このほかに土台のStringに変更を加えないで、与えられたものを追加したStringを返すメソッドがある。
func appending(_ aString: String) -> Stringこれは土台のStringが変更されないので、mutatingが付けられていない。他の編集系メソッドにも語尾がingでこの性質のメソッドがある。

insert(挿入)系これも名前がinsertに統一された。
appendと同じようにCharacterシーケンスの場合はラベルにcontentOfが付けられる。
Stringを受けるものはない?
mutating func insert(_ newElement: Character, at i: String.Index)mutating func insert…