投稿

9月, 2016の投稿を表示しています

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…

Swift2.2からSwift3.0への変換を行ってみて

イメージ
Xcode8のGMが出たので、Swiftを2.2から3.0へ変換しました。自動でコンバートするXcodeの機能を使いました。
変換箇所があらかじめ表示されるので、一通り見て気が付いたことを書いていこうと思います。

enumの要素の頭文字が小文字に統一
どっちが正解なのかなぁと思いながらプログラムを作成していた部分なのではっきり決めてくれて良かったです。

配列の初期化メソッド
配列の初期化によく使われる
init(count: repeatedValue: )が
init(repeating: count: )
になりました。順番が変わって、さらに現在分詞になりました。

NS抜け
NSBundle が Bundle へ変更
NSIndexPath が IndexPath へ変更
NSURL が URL へ変更
Appleに従うのみ。

タイプメソッド扱いしていたものがタイププロパティ扱いに
NSBundle.mainBundle() が Bundle.main へ変更
UIScreen.mainScreen() が UIScreen.main へ変更
UIDevice.currentDevice() が UIDevice.current へ変更
UIColor.whiteColor() が UIColor.white へ変更
//例 open class var white: UIColor { get }従うのみ。

CoreGraphics衣替え
CGRectMakeなどのC言語ベースのCG***関数がSwift3.0では廃止になっています。
(旧)CGRectMake(***) が
(新)CGRect(***) へ変更、CGRect(***)の方はSwiftの構造体のinit命令呼び出しです。

(旧)CGPointMake(***) が
(新)CGPoint(***) へ変更、CGPoint(***)の方はSwiftの構造体のinit命令呼び出しです。

(旧)CGRectContainsPoint(CGRect rect, CGPoint point) が
(新)CGRectインスタンスに対するcontains(_:)メソッドへ変更

(旧)CGContextFillPath(CGContextRef cg_nullable c) が
(新)CGContextインスタンスのfil…

iOS10対策

イメージ
Privacy - Media Library Usage Description
この問題はシミュレータ(Xcode8.0)で発生したが、実機では発生しませんでした。
iPodライブラリの曲をアプリ内で使うとき、ユーザーに許可を取るようになりました。
この時の文面をinfo.plistに設定する必要があります。
Privacy - Media Library Usage Description(rawキーではNSAppleMusicUsageDescription)に何か文を追加します。
これを設定しておくと、アプリがライブラリにアクセスしようとしたところで、Don't allow / OKダイアログをOSが勝手に出してくれて、その中に先ほどの自分で追加した文が表示されます。
これを設定しないと、アプリが落ちます。
出す文章を各言語毎に変えたい時は、InfoPlist.stringsのローカライズをするとよいでしょう。

xibファイルのBuilds for
この問題はシミュレータ(Xcode8.0)で発生したが、実機では発生しませんでした。
[UIDeviceRGBColor length]で実行時エラーが発生しました。これは自分で書いたプログラムではないので原因がわかりにくかったのですが、xibファイルのBuilds forが未設定でした。Xcode3の時に作成したプロジェクトで発生しました。xibファイルのBuilds forをDeployment Target (8.0)にしました。