Xcode 6 公開ノート
Xcode 6.4 公開ノート
新機能
Xcode 6.4 は、iOS 8.4 のアプリ開発をサポートするための iOS 8.4 SDK が含まれています。
既知の問題
インストルメント
- Xcode で最初のビルドと実行サイクルのちょっと後に、インストルメントはプロファシルできなくなり、iOS デバイスがオフラインであることを示して、開発のためのデバイスを有効にするため、Xcode を開くよう求めます。
インストルメントを終了、Xcode を開く、[Window] < Device の選択、iOS デバイスの選択。いずれかのタスクが進行中として表示されている場合は、それらが完了し、デバイスのウィンドウを閉じて、待って下さい。Xcode からビルドとアプリを実行し、[停止]をクリックします。約1分待ってから、コマンド-1を押し、インストルメントを起動します。デバイスは、もはやオフラインと表示されないはずであり、プロファイルが有効になります。(21412937)
Xcode 6.3.2 公開ノート
Swift コンパイラ
- Swift プロジェクトは今 Xcode 6.3.2 で早くコンパイルできるようになりました、スピードが遅くなっていたのを解決しました。
Xcode 6.3.1 で、Swift は、"Merge(結合)" のコンパイル段階は、いくつかのターゲットでハングアップしたように見えることがありました。この問題を回避するために、モジュール全体の最適化を有効にする必要はもはやありません。(20638611)
Xcode 6.3.1 公開ノート
解決済みの問題
Swift
- "Open Quickly(すばやく開く)" を使用して、SDK からのシンボルが、Swift を使用したプロジェクトやワークスペースで使用できます。(20349540)
プレイグラウンド
- 無効なターゲットプラットフォーム値のプレイグラウンドでも、Xcode はクラッシュしません。(20327968)
- プレイグラウンドを開くときに、すぐ「取り消し」を選択しても、無効なターゲットプラットフォーム値を設定しません。(20327880)
Interface Builder
- ストーリーボードと xib ファイルにカスタムフォントを使用しても、Xcode はハングアップすることはありません。(20476377)
- 自動レイアウトを無効にすると、NSTextView nib の復元が正常に動作します。(20523924)
デバッガ
- 現在の関数は、Swift のフレームワークから来るため Xcode のデバッガ変数ビューは、現在のフレームの値を省略しません。(20380047)
テスト
- Swift のテストは Xcode によって自動的に発見されます。(20373533)
一般
- ソース管理下にはなく、ソース管理下にある内容を含むプロジェクトまたはワークスペースをアーカイブしても Xcode がクラッシュしません。(20521089)
- コマンドラインツールのプロダクトは、__debug ヘッダーを含みます。(20523314)
- ローカライズされたファイルの名前を変更できます。(20490808)
- "実行するためには不適格" として以前に誤って記載されているデバイスは正しく記載されています。(20121178)
Xcode 6.3 公開ノート
新機能
App Store と TestFlight ユーザーのためのクラッシュ・オーガナイザ
- アプリのクラッシュレポートを表示するには最初 Xcode の環境設定の「Accounts(アカウント)」ペインで、開発者アカウントを入力します。開発者アカウントに関連付けられている iOS アプリのクラッシュレポートが、Xcode のオーガナイザのウィンドウに表示されます。
- クラッシュレポートは、シンボル情報と共に iTunes Connect にアップロードされたアプリにのみ使用できます。
- Xcode はそれぞれのアプリのそれぞれのトップのクラッシュ・リストを提供します。
- クラッシュレポートは完全にシンボル化され、Apple のサーバに集約されます。
- Xcode はあなたのクラッシュレポートを管理し、プロジェクトのソースコードのすぐそばに直接バックトレースを表示するためのワークフローを提供します。
Xcode 6.3 は、オプションで App Store のユーザーや TestFlight のユーザーがアプリのクラッシュログデータを収集・分析するのに役立つ新しい機能を含んでいます。
クラッシュレポートは、App Store のユーザーや TestFlight ユーザーがクラッシュオーガナイザーで表示することができるものから集めます。
詳細については、Xcode のドキュメントの、クラッシュ・オーガナイザ・ヘルプ を参照してください。(14995491)
Xcode プレイグラウンド
Playground (プレイグラウンド) はインラインにマークアップされたコメントを使用し、インラインのプレイグラウンドの結果を用いてマニュアルのオーサリングで強化され、表示する機能やプレイグラウンドに埋め込まれたリソースの編集、およびプレイグラウンドに補助ソースファイルを統合する機能を強化しました。これらの機能は、プレイグラウンドの豊富な新しい体験の作成を可能にします。
これらの機能強化は、以下の プレイグラウンド の機能強化 のセクションで詳述されています。
Swift 1.2
- Swift 言語の変更点
- Swift 言語の修正
- Swift 言語の機能強化
- Swift のパフォーマンス
- Swift 標準ライブラリの機能強化と変更点
Xcode 6.3 は、重要な変更、修正、および機能拡張を行った Swift 言語、Swift 1.2 の新しいバージョンを含んでいます。詳細については、以下の公開ノートの次のセクションを参照してください。
Swift 1.1 から Swift 1.2 への素早い移行
ソース移行ツールツールは、Swift 1.1 (Xcode 6.2) からSwift 1.2 (Xcode 6.3) への Swift ソースコードの更新を助けるために提供されています。
Xcode で、[Edit(編集)] > [Convert(変換)] > [To Latest Swift Syntax(最新の Swift の構文に変換)] を選択します。
Objective-C
Objective-C のコードは、Swift と Objective-C のコード間の相互運用性を向上させるために強化されました。詳細については、この公開ノートの Object-C 言語の機能強化 のセクションを参照してください。
デバッガ
LLDB は、C ベースの言語でのモジュールのサポートを向上させるだけでなく、Swift のデバッグサポートの全体的な改善を提供するために強化されました。詳細については、デバッガの機能強化 のセクションを参照してください。
Apple LLVM コンパイラバージョン 6.1
Apple LLVM コンパイラがバージョン 6.1.0 に更新されました。
この更新されたコンパイラは、C++14 言語規格を完全にサポートし、広い範囲で強化された警告診断、および新しい最適化を含んでいます。arm64 アーキテクチャのサポートが大幅に優れた ARM の実装と並ぶように改訂されました。最も目に見える影響は、いくつかのベクトル組み込み関数が、より密接に、ARM の仕様に合わせて変更されているということです。
ARM64 組み込み関数
arm64 の vfma/vfms レーン組み込み関数の引数の順序が変更されました。この変更は、リスクを軽減するために段階的に導入されています。
重要: 詳細は、"ARM64 組み込み関数の変更" を参照して下さい。
フォースタッチ
Xcode 6.3 は、それを含む Mac 用のフォースタッチ・トラックパッドのジェスチャーをサポートし、NSButton と NSSegmentedControl の為に Interface Builder でフォースタッチ・トラックパッド機能の設定をサポートしています。
注意: Interface Builder でフォースタッチの採用をするには、OS X ヨセミテ・バージョン 10.10.3 上の Xcode を実行している必要があります。
(16140561, 16140600, 18660545)
変更、機能強化、注意点
Swift 言語の変更点
- 保証された変換や "強制された failable" の変換の概念は現在、2つの演算子に分離されます。強制された failable 変換は今は as! 演算子を使っています。! は、キャストが失敗し、実行時エラーを生成するかもしれない事をコードの読者に明確にします。"as" 演算子がアップキャストのために (つまり、"ベースとして someDerivedValue" ) 残っており、失敗することが決してない事が保証されている ("Int8 として 0") 型の注釈です。(19031957)
- 構造体とクラス・イニシャライザーで不変 (let) のプロパティは、一般的に "let は単独で初期化されますが、再割り当てしたり、変変更したりは決してない" モデルである事を標準化するように改訂されました。以前は、イニシャライザーの本体内で完全に変更可能でした。今や、それらは一度だけ値を提供するために代入されることを許可されます。プロパティがその宣言内に初期値を持っている場合、それはすべてイニシャライザーの初期値としてカウントされます。(19035287)
- それらは、Swift の値型 (文字列/配列/辞書) に対応するブリッジされた Objective-C のクラス (NSString/NSArra/NSDictionary) からの暗黙の型変換は Swift の型システムを、よりシンプルかつ予測可能なようにするため、削除されました。
これは次のコードが機能しなくなることを意味します。
import Foundation func log(s: String) { println(x) } let ns: NSString = "some NSString" // okay: literals still work log(ns) // fails with the error // "'NSString' is not convertible to 'String'"
そのようなブリッジ変換を行うために、as キーワードで変換を明示的にします。
それらのブリッジした Objective-C クラスへの Swift の値型からの暗黙的な変換がまだ許可されています。例えば:
func nsLog(ns: NSString) { println(ns) } let s: String = “some String” nsLog(s) // okay: implicit conversion from String to NSString is permitted
- @autoclosure 属性は、パラメータの属性であり、パラメータの型の属性ではありません。
Objective-C のヘッダ内のこれらの Cocoa の型がまだ、それらに対応する Swift の型に自動的にブリッジされている事に注意して下さい。すなわち、Swift のソース·ファイル内の (例えば) NSString を明示的に参照している場合、そのコードのみが影響を受けていることを意味します。これはクラスクラスタ内のサブクラスを実装するように、高度な何かをやっていない限り、直接対応する Swift の型 (例えば、String) を使用する場合、お勧めします。(18311362)
あなたが使用する前は:
これからはこう書きましょう:
- パラメータの @autoclosure 属性は新しい @noescapeZ 属性を意味します。
- カリー型関数のパラメータは現在、引数のラベルを指定することができます。
(15217242)
例えば:
func curryUnnamed(a: Int)(_ b: Int) { return a + b } curryUnnamed(1)(2) func curryNamed(first a: Int)(second b: Int) -> Int { return a + b } curryNamed(first: 1)(second: 2)
- Swift は現在、オーバーロードと Swift の型システムにおけるオーバーライドと Objective-C ランタイム経由で見られる効果的な動作の間の矛盾を検出するようになりました。
(17237268)
例えば、クラスの "プロパティ" とその拡張型のメソッド "setProperty" のための Objective-C のセッタの間には、以下の不調和が今や診断されています。
class A : NSObject { var property: String = "Hello" // note: Objective-C method 'setProperty:’ // previously declared by setter for // 'property’ here } extension A { func setProperty(str: String) { } // error: method ‘setProperty’ // redeclares Objective-C method //'setProperty:’ }
同様のチェックは Objective-C ランタイムで偶発したオーバーライドに適用されます。
class B : NSObject { func method(arg: String) { } // note: overridden declaration // here has type ‘(String) -> ()’ } class C : B { func method(arg: [String]) { } // error: overriding method with // selector ‘method:’ has incompatible // type ‘([String]) -> ()’ }
同様に、プロトコルに準拠して:
class MyDelegate : NSObject, NSURLSessionDelegate { func URLSession(session: NSURLSession, didBecomeInvalidWithError: Bool){ } // error: Objective-C method 'URLSession:didBecomeInvalidWithError:' // provided by method 'URLSession(_:didBecomeInvalidWithError:)' // conflicts with optional requirement method // 'URLSession(_:didBecomeInvalidWithError:)' in protocol // 'NSURLSessionDelegate' }
- Nil 合体演算子 (??) の優先順位は、変換および範囲演算子としてよりも緩いが、短絡的論理と比較演算子をより緊密に、結合するために提起されています。これは以下のような式の、より有用な動作を提供します:
(18391046, 18383574)
- &/ および &% 演算子は、言語を簡素化し、一貫性を向上させるために、削除されました。
- ASCII 値から UInt8 を構築するには ascii キーワードパラメータを必要とするようになりました。ASCII でない Unicode のスカラーを使用すると、このイニシャライザーがトラップする原因となります。(18509195)
- Swift は、サイズとカウントが、負でない場合であっても、符号付きの数値として表現されることを好むので、C の size_t 型のファミリーは、今、Int として Swift にインポートされています。
&+ や &-,&* とは異なり、これらの演算子は、2の補数計算動作を提供していません。それらは、ゼロによる除算、Int.min/-1 及び残りの特別な場合の動作を提供します。必要に応じてこれらのテストは、比較のようなコードで明示的に記述する必要があります。(17926954)
この変更は、Int と UInt 間の明示的な型変換の量を軽減し、Int 型を返す sizeof とのより良い調整をさせ、より安全な算術プロパティを提供します。 (18949559)
NSObject を継承せず、@objc プロトコルを採用するクラスは、@objc などのプロトコル要件を満たすために、それらのメソッド、プロパティ、およびイニシャライザーを使用し、明示的にマークする事が必要になります。
例えば:
@objc protocol SomethingDelegate { func didSomething() } class MySomethingDelegate : SomethingDelegate { @objc func didSomething() { … } }
Swift 言語の修正
- ダイナミックキャスト (as!,as? 及び is) は今、それらが関連付けられた型を持っていない限り、Swift のプロトコルタイプで動作します。(18869156)
- 予想通り、プレイグラウンド内に適合を追加しても、動作します。
例えば:
struct Point { var x, y: Double } extension Point : Printable { var description: String { return "(\(x), \(y))" } } var p1 = Point(x: 1.5, y: 2.5) println(p1) // prints "(1.5, 2.5)”
- UIViewAnimationCurve のような文書化されていない値は、NS_ENUM 型をインポートされ、init(rawValue:) イニシャライザーを使用してそれらの生の整数値から変換することが今できます。この問題の回避策として unsafeBitCast を使用したコードは、生の値のイニシャライザーを使用するように書くことができます。
例えば:
let animationCurve = unsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue, UIViewAnimationCurve.self)
これは代わりに、このように書くことができます:
let animationCurve = UIViewAnimationCurve(rawValue: userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!
- 負の浮動小数点リテラルは、現在列挙で生の値として受け入れられています。(16504472)
- 参照されたオブジェクトが解放された後に所有されていない参照を保持するオブジェクトが割り当て解除された場合、Objective-C のオブジェクト、または Objective-C のオブジェクトから継承する Swift のオブジェクトへの所有されていない参照は、もはやクラッシュを引き起こしません。(18091547)
- 監視アクセサを持つ変数とプロパティは、初期値の式から推測できる場合には、もはや明示的な型を必要としません。(18148072)
- 完全に適用されたとき、汎用のカリー化関数は、もはやランダムな結果を生成しません。(18988428)
- nil に対する、失敗した NSClassFromString 検索の結果を比較すると、正しく動作するようになりました。(19318533)
- optional の共変量及び反変量型で基本クラスのメソッドをオーバーライドしたサブクラスは、もはや、実行時にクラッシュを起こしません。
(19005771)
例えば:
class Base { func foo(x: String) -> String? { return x } } class Derived: Base { override func foo(x: String?) -> String { return x! } }
(19321484)
Swift 言語の機能強化
- Swift は、一つのファイルが変更されたときに、ターゲット内のすべての Swift のソースファイルを再ビルドせず、段階的にターゲットをビルドするのをサポートしています。
- 新たな Set 設定データ構造体は、完全な値の意味を持つユニークな要素の汎用のコレクションを提供している物を含んでいます。これは、Array と Dictionary に類似した機能を提供する、NSSet とブリッジします。(14661754)
- if-let 構築物は、複数の optionals をテストし、汎用の制約に似た構文を使用して、一つの if (または while) 文で条件を守るように拡張されています:
まだ絶対的に必要な以上の多くのファイルで再ビルドをする場合、段階的ビルド機能は、保守的な依存関係の分析に基づいています。ファイルは、それが再構築されるべき時にされない場合を見つけた時は、バグレポートを提出してください。その後、ターゲットで clean を実行すると、正常にビルドを完了できます。(18248514)
if let a = foo(), b = bar() where a < b, let c = baz() { }
これにより、複数の optionals をテストし、望ましくない入れ子を導入することなく、ブール条件の介在含めることができます (例えば、optional の "運命のピラミッド" の開封を避けるため)。
さらに、if-let は今、optional の let 句と共の結合を、一つの先導するブール条件もサポートしています。例えば:
if someValue > 42 && someOtherThing < 19, let a = getOptionalThing() where a > someValue { }
- if-let 構文は、optional の let 句と共の結合を、一つの先導するブール条件をサポートするように拡張されました。
(19797158), (19382942)
例えば:
if someValue > 42 && someOtherThing < 19, let a = getOptionalThing() where a > someValue { }
- let 定数は、もはや即時の初期化を必要としないように一般化されています。新しいルールは、let 定数は使用前に初期化されなければならず (var のように)、初期化されるだけでよく、初期化後に再代入されたり変異してはならない。これで、次のようなパターンが可能になります。
(19797158)
let x: SomeThing if condition { x = foo() } else { x = bar() } use(x)
- "static" (静的) メソッドとプロパティは、(class final の別名として) クラスで許可されるようになりました。これで、グローバルな保管場所を持っているし、レイジー (グローバル変数のように) 最初のアクセスで怠惰に初期化されたクラスで静的に格納されたプロパティを宣言する事が許可されています。プロトコルは、class 要件で宣言する代わりに、static として型の要件を宣言するようになりました。(17198298)
- 一つの式のクロージャの型推論は、いくつかの方法で改善されました:
- 一つの return 文で構成されているクロージャは、一つの式のクロージャとしてチェックされる型です。
- void でない戻り値の型を持つ注釈のない一つの式のクロージャは、Void の文脈で使用できまるようになりました。
- 戻り値の型の注釈が推論できないため、複数文のクロージャの型がある状況で推論できなかった事は、正しく診断されるようになりました。
- Swift の列挙型は、@objc 属性を使用して Objective-C にエクスポートできるようになりました。@objc 列挙型は整数の生の型を宣言する必要があり、半用のものか、関連付けられた値を使用することはできません。Objective-C の列挙型が名前を付ける溶融がないため、列挙型の場合は、列挙型の名前とケースの名前の連結としての Objective-C にインポートされます。
これは、変異を行わないにもかかわらず、以前は、var の使用を必要としていました。(16181314)
たとえば、この Swift の宣言は:
@objc enum Bear: Int { case Black, Grizzly, Polar }
Objective-C に、以下のようにインポートされます:
typedef NS_ENUM(NSInteger, Bear) { BearBlack, BearGrizzly, BearPolar };
- Objective-C 言語の拡張機能は、Objective-C の API が ImplicitlyUnwrappedOptional なしにインポートすることができるように、Objective-C の API 内のポインタとブロックが null である可能性を示す事が出来るようになりました。(詳細については、以下の項目を参照してください。)(18868820)
- Swift は Swift では本来サポートされていない、union(共同体)、ビットフィールド、SIMD ベクトル型、および他の C 言語機能を含む C 集合体を部分的にインポートすることができるようになりました。サポートされていないフィールドは、Swift からアクセスできなくなりますが、これらの型の値の引数と戻り値を持つ CとObjective-C API は Swift で使用できます。これは、とりわけ、ファウンデーションの NSDecimal 型と GLKit GLKVector と GLKMatrix 型を含んでいます。(15951448)
- インポートされた C の構造体は現在、構造体のすべてのフィールドをゼロに初期化する、Swift のデフォルトのイニシャライザーを持っています。
(16967385)
例えば:
import Darwin var devNullStat = stat() stat("/dev/null", &devNullStat)
- String,String.UnicodeScalarView、String.UTF16View, そして String.UTF8View のインデックス型の間に変換するための新しい API だけでなく、それぞれの String view を String に変換するための API が利用可能です。(18018911)
- println または文字列補間で使用する場合、型の値は現在、完全なデマングル型名として印刷します。
構造体は正しくゼロで初期化できないフィールドを含んでいて (すなわち、ポインタフィールドが新しい__nonnull 修飾子でマークされている) このデフォルトのイニシャライザーが抑えられます。(18338802)
toString(Int.self) // prints “Swift.Int" println([Float].self) // prints "Swift.Array<Swift.Float>” println((Int, String).self) // prints "(Swift.Int, Swift.String)"
- 新しい @noescape 属性が関数へのクロージャのパラメータに使用できます。これはパラメータが、呼び出された (または呼び出し中に @noescape パラメータとして渡された) 事があるだけの事を示し、呼び出しの期間より長く存続できないことを意味します。これは、いくつかのマイナーなパフォーマンスの最適化が可能となり、より重要なのクロージャの引数 "self." の要件を無効にします。これはそれらの動作についてもっと透明にする制御フローのような関数を可能にします。今後のベータ版では、標準ライブラリは autoreleasepool() のような関数でこの属性を採用します。
(18947381)
func autoreleasepool(@noescape code: () -> ()) { pushAutoreleasePool() code() popAutoreleasePool() }
- パフォーマンスは、実質的に、多くの場合、Swift 1.1 よりも改善されています。例えば、多次元配列は、アルゴリズム的にいくつかのケースで速くなり、最適化されていないコードは、多くの場合、はるかに速くなり、多くの他の改良がなされています。
- 表現型チェックエラーで放たれる診断は、多くの場合に非常に改善されています。(18869019)
- 多くの一般的な表現の種類の型チェッカーのパフォーマンスが大幅に改善されました。これはかなりビルド時間を改善し、"表現が複雑すぎる" エラーの数を減少させます。(18868985)
- @autoclosure 属性は @autoclosure と同じ、発信側の構文を提供する2番目の形である @autoclosure(escaping) の形を持っていますが、結果のクロージャは、実装の中にエスケープすることができます。
(16323038)
例えば:
func lazyAssertion(@autoclosure(escaping) condition: () -> Bool, message: String = "") { lazyAssertions.append(condition) // escapes } lazyAssertion(1 == 2, message: "fail eventually")
(19499207)
Swift のパフォーマンス
- Swift で導入された新しいコンパイルモードは、モジュール全体の最適化と呼ばれます。このオプションは、ターゲット内のすべてのファイルを一緒に最適化し、(コンパイル時間が増えるのを犠牲にして) パフォーマンスが向上します。新しいフラグは、"モジュール全体の最適化" ビルド設定を使用すると、Xcode で有効となり、またはフラグ -whole-module-optimization で swiftc コマンドラインツールを使用して有効にできます。(18603795)
Swift 標準ライブラリの機能強化と変更点
- flatMap を、標準ライブラリに追加されました。flatMap は、何かの上に関数をマッピングし、1レベルを平らにした結果を返す関数です。flatMap は、以下のような配列を平らにするなど、多くの用途を持っています。
または関数を持つ optionals へ連鎖し:
- zip 関数が追加されました。これは、1つのタプルのシーケンスに2つのシーケンスを結合します。(17292393)
- utf16Count は String から削除されました。UTF16 ビューの count の使用は代わりに String を使用して下さい。
(19881534)
例えば:
(17627758)
Object-C 言語の機能強化
- Objective-C の API は、パラメータ、戻り値の型、プロパティ、変数などの "NULL可能性" を表現することが出来るようになりました。例えば、ここにいくつかのの UITableView API の NULL可能性の表現があります。
-(void)registerNib:(nonnull UINib *)nib forCellReuseIdentifier: (nonnull NSString *)identifier; -(nullable UITableViewCell *)cellForRowAtIndexPath: (nonnull NSIndexPath)indexPath; @property (nonatomic, readwrite, retain, nullable) UIView *backgroundView;
nullable 修飾子は、Objective-C の API のオプション性が Swift にある時に影響を与えます。暗黙的に開封された optionals (例えば、UINib!) をインポートする代わりに、ので、nonnull の修飾子の型は optional でない (例えば、UINib) としてインポートされ、nullable 修飾子の型は optional としてインポートされ、(例えば、UITableViewCell?) 上記の API は、以下のように Swift で見られます。
func registerNib(nib: UINib, forCellReuseIdentifier identifier: String) func cellForRowAtIndexPath(indexPath: NSIndexPath) -> UITableViewCell? var backgroundView: UIView?
nullable 修飾子も、null 可能性修飾子の二連続下線バージョンを使用して C のポインタ、ブロックポインタ、および C++ のメンバポインタを含む任意のポインタ型に適用することができます。例えば、C API を以下のように考えてください。
ここでは、コールバック自体が nullable (null 可能)で、そのコールバックの結果の型は null ではない。この API は、Swifrt から以下のように使用できるます。
つまり、nullable 許可指定子には3つの違った種類のものがあり、二重のアンダースコアのある(ポインター型の場合)、またはない綴りを持っています。(Object-C プロパティ、メソッドの戻り値型、そしてパラメータの型の場合)
型修飾子のスペル | Objective-C のプロパティ/メソッドの綴り | Swift ビュー | 意味 |
---|---|---|---|
__nonnull | nonnull | optional でない、例えば、UINib | 値は、(おそらく引数でのメッセージングの nil を除く) nil であることは決して期待されません。 |
__nullable | nullable | optional、例えば、UITableViewCell? | 値は nil かもしれません。 |
__null_unspecified | null_unspecified | 暗黙的に開封されoptional、例えば、NSDate! | これは、値が nil になるかどうかは不明。(非常にまれ) |
特に、Objective-C の API の中では、多くのポインタは null 以外である傾向があります。そのため、Objective-C は、注釈付きでないポインタが null でないことを前提としており (新しい #pragma を経由して) "監査された" 領域を提供しています。たとえば、次の例は、最初の例と同じですが、プレゼンテーションを簡単にするために監査された領域を使用しています。
NS_ASSUME_NONNULL_BEGIN // … -(void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier; -(nullable UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath)indexPath; @property (nonatomic, readwrite, retain, nullable) UIView *backgroundView; // … NS_ASSUME_NONNULL_END
- Objective-C の API は、セッタが nil である事を許可するプロパティの null 可能性を表現することができるようになり、(いくつかのデフォルトに "リセット" するため) しかし、そのゲッタは nil を生成することは決してなく (それらは代わりにいくつかのデフォルトを提供する) null_resettable プロパティ属性を使用しています。そのようなプロパティは UIView で tintColor になっており、ティントカラーが指定されていない場合、デフォルトのシステムティントカラーを置換します。
一貫性のために、それらの API の null 可能性を記述できるかどうかをすべての Objective-C ヘッダで監査された領域を使用することをお勧めしますし、既存のヘッダーに null 可能性を導入しながら、過渡的なツールとして以外は、null_unspecified を避ける事をお勧めします。
Objective-C の API に null 可能性の注釈を追加する事は、下位互換性やコンパイラがコードを生成する方法に影響しません。例えば、nonnull ポインタは、nil の受信者にメッセージしたようなとき、まだ場合によって、nil になってしまうことがあります。しかし、(例えば) nil 引数が nonnull のパラメータに渡された場合は、null 可能性の注釈は、Swift での経験の向上に加え、Objective-C の API を、より表現的で正確に使いやすくなって、Objective-C で新たな警告を提供します。(18868820)
例えば:
このような API は、例えば、暗黙のうちに、開封された optionals 経由で Swift にインポートされます:
- C のポインタ型のパラメータまたはブロックポインタ型は、ポインタ引数が "エスケープ" しない関数である事を示すためか、渡されているメソッドである事を、新しい noescape 属性で注釈を付けることができます。
(19051334)
このような場合には、例えば、ローカル変数のアドレスを渡すために、noescape ブロックポインタパラメータは @noescape パラメータとして Swift にインポートされるのが安全です。
は Swift に以下のようにインポートされます
(19389222)
プレイグラウンド の機能強化
- プレイグラウンド は、作成して、マークアップされたテキストを使用してリッチドキュメントを編集するための簡単な方法を提供するようになりました。テキストがリッチコメントとして表現されるべきであることを示す新しい//: や /*: */ スタイルのコメントを使用してください。Editor メニューの "Show Documentation as Rich Text (ドキュメントをリッチテキストとして表示)" と "Show Documentation as Raw Text (ドキュメントを生のテキストとして表示)" コマンドを用いて プレイグラウンド の表示モードを変更して下さい。
- プレイグラウンド の結果は今や、タイムラインビューではなく、インラインで表示されます。複数の結果が一行上にあるときは、「一つの結果を表示」と、「すべての結果のリスト表示」を切り替えることができます。数値である結果の場合、グラフとして表示するという付加オプションがあります。結果は、多くの情報か、少ない情報を表示するようにサイズを変更できます。
- プレイグラウンド のスクロールとパフォーマンスが向上しました。
- プレイグラウンド は、[Editor] > [Upgrade Playground(プレイグラウンドを更新)] を選択して、新しい形式に更新することができます。
詳細については、Xcode のドキュメントの プレイグラウンド リファレンス を参照してください。(19265300)
詳細については、Xcode のドキュメントの プレイグラウンド のヘルプ を参照してください。(19259877)
注意: リッチ·コメントやサポートソースファイルの機能は、Xcode 6.3 以降で作成された プレイグラウンド でサポートされています。
- プレイグラウンド は、プロジェクトナビゲータで、その構造体を公開するようになりました。プロジェクトナビゲータを表示するには、[View] > [Navigators] > [Show Project Navigator] を選択して下さい。これは、プレイグラウンド 内からリソース (例えば、画像) を使用できるようになります。リソースフォルダを表示するには、プレイグラウンド をひねって明け、それらをドラッグして入れます (19115173)
- プレイグラウンド は今や、モジュールにコンパイルされ、自動的に プレイグラウンド にインポートされ補助的にソースファイルのサポートを、提供するようになりました。新しいソースファイルサポート機能を使用するには、プロジェクトナビゲータで プレイグラウンド をひねって開き、デフォルトでは SupportCode.swift という名前の一つのファイルを持つ新しいソースフォルダを表示します。そのファイルにコードを追加し、またはこのフォルダ内に新しいソースファイルを作成するのは、すべて自動的にモジュールにコンパイルされ、自動的に プレイグラウンド にインポートされます。(19460887)
(19938996)
デバッガの機能強化
- LLDB は現在、C、C++、および Objective-C の式を評価する時、デフォルトでは printf() のプロトタイプを含んでいます。
- LLDB の Objective-C の式パーサーはモジュールをインポートできるようになりました。その後の式は、モジュールで定義された関数やメソッドのプロトタイプを当てにできます。
これは arm64 デバイス上の式の評価の経験を向上しますが、printf() の矛盾する宣言を持っている .lldbinit でユーザー定義の表現プレフィックスとコンフリクトを起こす可能性があります。式の評価中にエラーが表示された場合、これが根本的原因である可能性があります。(19024779)
(lldb) p @import Foundation (lldb) p NSPointFromString(@"{10.0, 20.0}"); (NSPoint) $1 = (x = 10, y = 20)
Xcode 6.3 以前では、デバッグ情報のないメソッドや関数は、戻り値の型を指定するために明示的な型キャストを必要としでした。モジュールをインポートすることは、開発者に、この情報を手動で指定し決定する労働集約的なプロセスを避けさせることができます:
(lldb) p NSPointFromString(@"{10.0, 20.0}"); error: 'NSPointFromString' has unknown return type; cast the call to its declared return type error: 1 errors parsing expression (lldb) p (NSPoint)NSPointFromString(@"{10.0, 20.0}”); (NSPoint) $0 = (x = 10, y = 20)
モジュールをインポートするの他の利点は、より良いエラーメッセージと、64ビットデバイス上で動作した時の可変引数関数へのアクセス、そして潜在的に誤りの推論された引数の型の排除を含んでいます。
注意: いくつかのケースでは、適切な関数のプロトタイプを持っていないと、予期しない障害につながる可能性があります。
- デバイス上で実行されているコードをデバッグする際の Swift の式を評価するパフォーマンスが特に改善されました。
- LLDB の Swift のサポートの大幅な改善が Swift のデバッグの経験と共に多くの既知の問題に対処しました。(19656017)
(18782288)
これは Swift の REPL と、p,po, および expression のような LLDB コマンド を発行する際には、最も顕著になります。(19213054)
ARM64 組み込み関数の変更
- デフォルトでは、コンパイラは組み込み関数のいずれかの使用について警告しますが、古い動作を保持します。
- できるだけ早く、新しい動作を採用し、USE_CORRECT_VFMA_INTRINSICS マクロを値 1 で定義します。
- USE_CORRECT_VFMA_INTRINSICS マクロの値を、0 と定義した場合、警告音を止め古い動作を維持します。しかし、長い間コードをそのままにしておきません:古い動作のサポートは、将来のリリースでは削除されるでしょう。
arm64 の vfma/vfms レーン組み込み関数の引数の順序が変更されました。
変更は、コンパイル時のエラーをトリガしないことがありますが、それは、実行時にコードが壊れます。リスクを軽減するために、新しい順序付けへの移行は以下のように段階的に完成されます。
(17964959)
解決済みの問題
以前の Xcode のリリースで報告されたこれらの問題は、Xcode 6.3で解決されました。
iOS シミュレータ
- Watch 拡張機能を含むアプリは、8.2 以前の iOS バージョンの iOS シミュレータには展開していません。(20032374)
- iOS 8.1 および 8.2 シミュレータ実行時に期待どおり AudioServicesPlaySystemSound を使用したオーディオ再生が機能しません。(17911598)
一般
- 最初のロックが解除されることなく、iPhone を再起動した場合、そのコンパニオン iPhone とペアリングし、ホストの Mac に接続していると Xcode は Watch を表示しません。(19864431)
- Apple ウォッチアプリのプロジェクトにスキームを共有すると、iOS と Apple の腕時計のアプリスキームが作成されるのを防ぎます。(18941832)
- Apple 腕時計のアプリと同じバージョン情報を持っていない App Store のインポートは失敗します。(17812309)
- 最初のロックが解除されることなく、iPhone を再起動した場合、そのコンパニオン iPhone とペアリングし、ホストの Mac に接続していると Xcode は Watch を表示しません。(19864431)
- Apple ウォッチ拡張機能を含むアプリの配置ターゲットは、iOS 8.2、以前用に設定されており、iOS 8.1.x 以前を実行しているデバイスにアプリを展開する場合、失敗します。(20032374)
既知の問題
Swift
- Convert to Latest Swift は、実行時ビルドエラーを生成する事があります。
- UITableViewController をサブクラス化する場合に、独自のイニシャライザーを作成しようとした場合、 "イニシャライザーはそのスーパークラスからの指定イニシャライザーを上書きしません。"と伝えるエラーが表示されます。
- Swift プロジェクトで、新しい空の iOS 用の Objective-C のファイルを作成します。これは「Objective-C のブリッジングヘッダーを構成しますか?」というシートを引き起こします。
- 「はい」をタップしてブリッジのヘッダーを作成します。
- [YOURPROJECTNAME]-Bridging-Header.h の内部に次のコードを追加します。
- プロジェクトを再度ビルドします。
- Swift 1.2 は、@objc メソッドおよびイニシャライザの、Objective-C ではサポートされていない、型ベースのオーバーロードをチェックするため厳しいです。
これらのエラーは無視しても安全であり、生成されたソースの変更には影響しません。(19650497)
指定イニシャライザの initWithNibName をオーバーライドするには、Objective-C のブリッジングヘッダ内のクラス拡張機能における指定イニシャライザとしてそれを宣言する必要があります。次の手順は、このプロセスをガイドします。
@import UIKit; @interface UITableViewController() - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; @end
(19775924)
// Has the Objective-C selector "performOperation:". func performOperation(op: NSOperation) { /* do something */ } // Also has the selector "performOperation:". func performOperation(fn: () -> Void) { self.performOperation(NSBlockOperation(block: fn)) }
- 理にかなっている場合は、@objc の推論を無効にするため、メンバーを private とマークして下さい。
- それ以外の場合は、例えば、_ nonobjc: () = () と、デフォルト値でダミーパラメータを使用します。
- private サブクラスでの Objective-C に公開されたメソッドのオーバーライドは、@objc である事には影響されず、Swift コンパイラがクラッシュする原因になります。
- Swift を使用するプロジェクトまたはワークスペースで [Open Quickly(すばやく開く)] を使用した場合の SDK から記号は使用できません。(20349540)
このコードは、Swift から呼び出されたときには動作しますが、Objective-C から呼び出された場合簡単にクラッシュする可能性があります。
この問題を解決するために、Objective-C ランタイムにメンバーをさらす事から Swift コンパイラを防ぐための Objective-C でサポートされていない型を使用します。
(19826275)
明示的にそのようなオーバーライドするメソッドに @objc 属性を追加して下さい。(19935352)
プレイグラウンド
- プレイグラウンド で raw Source(生ソース) と Rich Text(リッチテキスト) の切り替えをすると、タイムラインが消えることがあります。
- プレイグラウンド を開いてすぐに Undo(元に戻す) を選択すると無効なターゲットプラットフォームを設定することがあります。
- プレイグラウンド が無効な値のターゲットプラットフォームを持っている場合 Xcode はクラッシュします。
アシスタントエディタのポップアップメニューから選択してタイムラインを表示できます。(20091907)
再度実行するか、有効なプラットフォームを選択するか、または、すでに文書を閉じている場合は、osx または ios のどちらかが target-platform のプロパティに指定されていることを確認するために プレイグラウンド の contents.xcplayground ファイルを編集して下さい。(20327880)
osx または ios のどちらかが target-platform のプロパティに指定されていることを確認するために プレイグラウンド の contents.xcplayground ファイルを編集して下さい。(20327968)
iOS シミュレータ
- iOS シミュレータ上で WatchKit アプリを起動すると、Watch シミュレータが自動的に起動しない場合があります。
- ローカライズ設定はターゲットのスキームで行われ (同様に、コマンドラインでその他の設定が行われ) 、iOS 8 ランタイムで iOS シミュレータで起動時に有効にされることはありません。
iOS シミュレータ上で WatchKit アプリを起動する前に Watch シミュレータを起動して下さい。(19830540)
設定アプリで目的の言語を選択してください。(19490124)
デバッガ
- デバッガを使用する場合は、変数のビューは、現在の関数が Swift のフレームワークから来る場合、現在のフレームの値を省略することがあります。
フレームワークのために Other Swift Options(Swift の他の設定) ビルド設定を -Xfrontend -serialize-debugging-options に追加します。(20380047)
テスト
- Swift のテストは Xcode のこのリリースでは自動的に見られません。ソースエディタのサイドバーのテストの注釈は表示されませんし、テストナビゲーターとスキームシートのテスト·アクション内のテストの表は空になります。
[Product(製品)] > [Test] を選択して Swift のテストを実行できます。テストが実行されると、それらは、テストナビゲーターとスキームシートに表示されます。以下の制限が適用されます。
この方法で実行することによって発見されたテストは、テスト·ナビゲーターでの限られた相互作用を提供します。たとえば、[Run] ボタンが表示されず、ナビゲータのテストをクリックすると、テストエラーの場合を除き、ソースコードにジャンプしません。
Run ボタンとテストの成功/失敗のインジケーターは、ソースエディタに表示されません。
(20373533)
一般
- デバッグできる前に、iOS の拡張機能は手動で有効にする必要があるかもしれません。(18603937)
- Xcode のメニューコマンド "Simulator Background Fetch(シミュレータの背景でフェッチ)" は動作しません。
- iOS の以前のバージョンを実行している接続されたデバイスは、実行先のメニューでは不適格と表示される場合があります。
代わりに iOS シミュレータのメニューコマンドを使用して下さい。(20145602)
この問題を解決するには、デバイスを一つずつ再接続します。(20320586)
最新の公開ノートの一覧については、公開ノートの更新を確認してください。
Xcode 6.2 公開ノート
新機能
WatchKit フレームワーク
- Apple ウォッチインターフェース、見かけ、および通知をビルドするためのデザインツール
- デバッグとプロファイリングのサポート
- テスト用のアプリ、見かけ、および通知のための iOS シミュレータにおける Apple ウォッチサポート
Xcode 6.2 は、新しい WatchKit フレームワークと Apple ·ウォッチアプリの開発を含む、iOS 8.2 のサポートを追加します。WatchKit のツールサポートを含みます。
既知の問題
Interface Builder
- Interface Builder は時々キャンバスに設計可能なクラスのサブクラスをレンダリングするのを失敗したり、またはスーパークラスから継承された検査可能なプロパティを示すのを失敗します。
サブクラス宣言に IB_DESIGNABLE または @IBDesignable を追加して下さい。(19512849)
アセット・カタログ
- 新しい Apple ウォッチアプリのターゲットを作成する場合は、新しく作成されたアセット·カタログは、カタログアプリのアイコンで "未割り当て" のスロットを含んでています。
- 38 ミリメートルデバイスの Apple·ウォッチのアプリアセットカタログの長く見えるスロットが間違ってラベルされています。ラベルは、このように読み取れます。
"未割り当て" のスロットを選択し、Delete キーを使用して削除して下さい。(19978639)
Apple Watch - Home Screen (All) - Long Look (42 mm) - 40pt
これはこのように読む必要があります。
Apple Watch - Home Screen - Long Look (38 mm) - 40pt
このスロットは、38 ミリメートルのデバイスアイコンでは正しく動作します。
42 ミリメートルデバイスの長く見えるスロットはこのようにラベルされています:Apple Watch - Long Look - 44pt. (19978648)
iOS シミュレータ
- iCloud アカウントは2つの要素での認証を必要とする事は iOS シミュレータでサポートされていません。
- iOS アプリと A@pple ウォッチアプリをシミュレータで同時に実行することはサポートされていません。
- apple ウォッチアプリをビルドして実行します。
- シミュレータのホーム画面で iOS アプリのアイコンをタップします。
- [Debug(デバッグ)] > [Attach to Process(プロセスにアタッチ)] を使用し、Xcode でiOSアプリをデバッグします。
- Apple ウォッチ拡張子を含むアプリは、iOS 8.1.x 以前の iOS シミュレータでは展開しない場合があります。
開発のために、2つの要素での認証を使用していないアカウントを作成して下さい。(18522339)
iOS アプリと Apple ウォッチアプリをデバッグするには:
(18559453)
Apple ウォッチ拡張子の Info.plist に "MinimumOSVersion" = "8.2" (最小OSバージョン=8.2) の鍵のペアを追加して下さい。(20032374)
インストルメント
- UI オートメーションインストルメントは WatchKit のアプリではサポートされていません。(19152139)
デバッギング
- Apple ウォッチアプリ内でブレークポイントで停止すると、[stop(停止)] のタップは、実行中のアプリを停止しません。
[stop(停止)] を二回タップします。(18991746)
一般
- Apple ウォッチアプリを含むプロジェクトでスキームを共有する事は、作成されてから iOS と Apple ウォッチアプリスキームを防ぎます。(18941832)
- OS X 10.10.2 以前のシステム上で動作しているとき、Apple ウォッチのアイコンが Xcode のデバイスウィンドウには表示されません。(19986057)
- 接続された iOS デバイスが、Trust 要求を承認するためにユーザーとの対話を必要とする場合に [Devices(デバイス)] ウィンドウには、警告が表示されません。
- 最初にロックが解除されずにコンパニオンの iPhone が再起動されホストの Mac に接続された場合、Xcode は Apple ウォッチをペアリングされているとは表示しません。
- App Store のインポートは、それらが含むアプリと同じバージョン情報を持っていない Apple ウォッチのアプリでは失敗します。
- Apple ウォッチ拡張機能を含むアプリの展開ターゲットが、iOS の 8.2 以前用に設定されている場合 iOS 8.1.x 以前の実行しているデバイスにアプリを展開するのは失敗することがあります。
トラストアラートを承認するには接続された iOS デバイスを使用してください。(19944552)
解決するには、iPhone を再起動し、Mac に接続する前にパスワードでロックを解除して下さい。(19864431)
このインポートの失敗を防ぐには、アップル·ウォッチアプリでの CFBundleVersion と CFBundleShortVersionString エントリとを含むアプリが同一であることを確認してください。(17812309)
手動での iOS 8.2 用の Apple ウォッチ拡張機能の展開ターゲットを設定して下さい。Apple ウォッチの拡張機能は 8.2 以前の iOS 上では動作しませんが、アプリの展開が許可されます。(20032374)
ノート
重要: Xcode 6.2 は、OS Xマーベリックス上での実行をサポートしている Xcode の最後のリリースです。(18673392)
Xcode 6.1.1 公開ノート
解決済みの問題
Swift 言語
- SourceKit のクラッシュの多くの一般的な原因は修正され、すなわち破損したモジュールのキャッシュと、古くなったデータを修正しました。
- AnyObject 値に純粋な Swift クラスのクラスオブジェクトを渡しても、もはやクラッシュしません。(18828226)
- プロトコル要件を満たすクラスメソッドと、イニシャライザは、汎用の文脈で呼び出されたときに正しくサブクラスのオーバーライドを呼び出します。例えば:
protocol P { class func foo() } class C: P { class func foo() { println("C!") } } class D: C { override class func foo() { println("D!") } } func foo<T: P>(x: T) { x.dynamicType.foo() } foo(C()) // Prints "C!" foo(D()) // Used to incorrectly print "C!", now prints "D!"
(18828217)
Interface Builder
- ヨセミテ上でスラッシュ ('/') 文字を含む画像名を持つ IB 文書を Interface Builder で開いたり、コンパイルすることができなかった問題を修正しました。+[NSImage imageNamed:] を呼び出すときに NSTaggedPointerString 上の範囲の例外として明示しました。(18752260)
Xcode サーバー
- Xcode のサーバーを構成した後に Xcode の新しいビルドを選択すると許可の問題を引き起こす可能性の問題を修正しました。(18819339)
- private のポータルキーチェーンがシステムキーチェーンへの symlink に置き換えられたときの Xcode サーバーのクラッシュを修正しました。(18854423)
- パスワードポリシーを使用した場合の起動時の問題を修正しました。(18819348)
- SSH 経由での接続時の Xcode サーバーのソースをチェックアウトする問題を修正しました。(18819357)
既知の問題点
デバッガ
- Swift のコードから参照されたときにビットフィールドを含むデータ構造体は、デバッガで正しく表示されない場合があります。(17967427)
アセット·カタログ
- プロジェクトの唯一の資産 (asset) はアセットカタログである場合、ビルドは次のようにエラーで失敗することがあります。'.../Contents/Resources は存在しません'
プロジェクトに少なくとも一つのアセットカタログでないリソースを追加して下さい。(17848595)
iOS シミュレータ
- iOS シミュレータは、ホストのネットワーク構成の変更した時、時々ネットワーク接続時緩くなります。
- iOS シミュレータで外部ディスプレイにビデオを再生する場合、外部ディスプレイは、すべて黒になるかもしれません。
- Xcode の環境設定でダウンロードパネルを使用して iOS 7.1 シミュレータをインストールした後、iOS 7.1 シミュレータのデバイスは、実行先のメニューで使用できない場合があります。
ネットワークの接続性を取り戻すためにシミュレートされたデバイスを再起動します。(17867038)
ビデオの再生中に外部ディスプレイの解像度を変更し、目的の解像度に戻して下さい。(17933514)
ログアウトし、再度ログインするか、またはコンピュータを再起動します。(19011252)
Xcode 6.1 公開ノート
新機能
Swift 言語
- Xcode 6.1 は Swift 1.1 を含んでいます。(18238390)
- 多くの AppKit API は多数の WebKit、Foundation、UIKit、CoreData、SceneKit、SpriteKit、Metal API に加えて、optional の適合性について監査されています。結果として、暗黙的に開封された optionals のかなりの数が、そのインターフェイスから削除されています。これらの変更は、プロパティ、引数、そして API の戻り値の null 可能性を明確にします。
API の変更は、T! を置き換えて T? か T のいずれかになるのは、それらがそれぞれ null になりうるかどうかです。間違っている場所を見つけた場合は、http://bugreport.apple.com にバグを提出し、件名に "#IUO" のタグを付けて下さい。
戻り値が誤って null でない可能性だと考慮したメソッド、プロパティ、またはイニシャライザと遭遇した場合は、optional で結果を包むことによって、問題を回避できます。
var fooOpt: NSFoo? = object.reallyMightReturnNil() if let foo = fooOpt {...}
これらのケースについてのバグを報告してください。
注意: まだ T1 としてマークされている API についてのバグを提出しないでください。我々はすでにそれらについて知っています。
- 型 Any の値は、関数型の値を含めることができるようになりました。(16406907)
- (Swift モジュールのクイックヘルプおよび合成されたヘッダに表示される) 標準ライブラリのドキュメントが改善されました。(16462500)
- *LiteralConvertible の全てのプロトコルが今や convertFrom で始まる静的メソッドというよりも、それらの要件のためのイニシャライザを使用するようになりました。たとえば、IntegerLiteralConvertible には現在、以下のイニシャライザの要件があります。
- Xcode は fixit のヒントを出して、古いスタイルの "fromRaw()/toRaw()" 列挙型の API から新しいスタイルのイニシャライザと "rawValue" プロパティへとコードを移動します。(18216832)
- クラスプロパティは、値を意味する型の O(n) 変異を避けるために、final マークをする必要はありません。(17416120)
- イニシャライザは nil を返すことによって失敗する可能性があります。失敗可能イニシャライザは、init? で宣言されて明示的な optional を返すか、または init! で暗黙的に開封された optional を返します。
以前にこれらのプロトコルの1つに適合した全ての型は、対応するイニシャライザと convertFromXXX の静的メソッドを交換する必要があります。(18154091)
たとえば、String.toInt は Int 型の失敗可能イニシャライザとして実装することができます。
extension Int { init?(fromString: String) { if let i = fromString.toInt() { // Initialize self = i } else { // Discard self and return 'nil' return nil } } }
失敗可能イニシャライザを使用して値を構築した結果は、この例のように、nil のチェックをする必要があります。
if let twentytwo = Int(fromString: "22") { println("the number is \(twentytwo)") } else { println("not a number") }
- Objective-C の init とファクトリーメソッドは、それらが nil を返すことができれば失敗可能イニシャライザとしてインポートされます。潜在的に nil を返す事についての情報がない場合には、Objective-C の init またはファクトリーメソッドがinit! として、インポートされます。
現在の実装では、構造体と列挙型のイニシャライザは、イニシャライザ内の全てのポイントで nil を返す可能性がありますが、オブジェクトの格納されたすべてのプロパティが初期化され、self.init または super.init が呼ばれた後には、クラスのイニシャライザは nil のみを返します。self.init または super.init が失敗可能イニシャライザにデリゲートするために使用された場合、呼ばれたイニシャライザが失敗した場合、現在のイニシャライザを暗黙的に伝搬し、nil を返します。(16480364)
この変更の一環として、+[NSString stringWithContentsOfFile] のような NSError** パラメータを持つファクトリメソッドは、今失敗可能イニシャライザとしてインポートされます。例えば:
init?(contentsOfFile path: String, encoding: NSStringEncoding, error: NSErrorPointer)
- OS X のアプリは現在、アプリのための暗黙の main を生成するために、自分のアプリのデリゲートクラスに @NSApplicationMain 属性を適用できます。
- キャストは今や CF 型 (CFString、CGImage、 および SecIdentity などのように) と AnyObject の間で行うことができます。このようなキャストは常に実行時に成功します。例えば:
(18232430)
この属性は、iOS アプリのための @UIApplicationMain 属性と同じように動作します。(16904667)
var cfStr: CFString = ...
var obj: AnyObject = cfStr as AnyObject
var cfStr = obj as CFString
(18088474)
プレイグラウンド
- iOS のプレイグラウンドは今や XCPShowView()XCPlayground API でのアニメーションビューを表示するのをサポートしています。この機能はデフォルトでは無効になっています。それはプレイグラウンドの設定インスペクタで "Run in Full Simulator(フルシミュレーターで実行)" 設定をチェックすることで有効になります。
機能を有効にすると、プレイグラウンドを実行すると、フルシミュレーターでプレイグラウンドを実行するための iOS シミュレータアプリケーションを起動します。この機能はまた、NSURLConnection の http リクエストのように、フルシミュレーターなしに失敗した他の機能のために必要とされます。フル iOS シミュレータで実行すると、デフォルト·モードで実行するよりも遅いです。(18282806)
テスト
解決済みの問題
プレイグラウンド
- プレイグラウンドで weak にリンクされたシンボルは、もはや、コンパイルエラーを発生しません。(18000684)
- OS X のプレイグラウンドで NSView のサブクラスを使用しても、もはや実行は失敗しません。(18449054)
ソースエディタ
- Swift のコードの編集中 に Xcode が応答しなくなる可能性を解決しました。
デバッギング
- デバッガコンソールの LLDB プロンプトから評価される 'expr','p', および 'print' のような Swift の式は今や、32 ビットの iOS デバイス上でうまく動作するようになりました。(18249931)
REPL
- Swift の REPLでは、REPL で定義されたクラスのインスタンスを検査しようとすると、格納されたプロパティで適切に形成されたデータを生成するようにうなりました。(18457336)
Xcode サーバー
- Xcode 6 の GM の以前のビルドを持っているシステム上の Xcode サーバの設定が、機能能するようになりました。(18314522)
iOS シミュレータ
- 予想通りに iOS シミュレータ上での設定アプリを変更した設定が今持続するようにうなりました。(18238018)
- 予想通りに iOS シミュレータからアプリを削除すると、ユーザーのデフォルト設定も削除するようになりました。(18307910)
既知の問題点
テンプレート
- Xcode 5.1.1 からの Xcode 6.1 への Xcode、iOS シミュレータ、およびドキュメントのダウンロードをアップグレードするユーザーは、デバイス上のマスター·ディテール·アプリをビルドし、実行する時に "ダイジェストが、ない" というエラーを受け取るかもしれない。
デバイスのプラグを抜き、それを再び差し込んで下さい。(18464963)
Interface Builder
- デフォルトでは、NSTableViews と NSOutlineViews は白い背景を持っており、コントロールが暗い外観で表示されたときに正しくない可能性があります。
明るい外観と暗い外観の両方を動的にサポートするには、NSTableView と NSOutlineView の背景を"デフォルト" から "背景色を制御する" に変更して下さい。(18075907)
iOS シミュレータ
- シミュレートされたデバイスは、いくつかの状況では、"作成" 状態にはまり込んでしまいます。この問題は、新しいデバイスを作成ったり、または Xcode.app を改名した後に、既存のデバイスをリセットするときのどちらかで発生する可能性があります。
- サードパーティ製のキーボードなど、ローカライズとキーボードの設定が、正しく iOS 8.1 Simulator での Safari、マップ、および開発者のアプリで守られていません。[NSLocale currentLocale] は en_US を返し、英語と絵文字キーボードのみが利用可能です。(18418630、18512161)
- アプリは iOS 8 SDK と OS X 10.10 SDK に新しいフレームワークに対して weak にリンクされている場合、実行先が古い iOS ランタイムの iOS シミュレータであり、ホスト·システムが OS X ヨセミテを実行している場合、それは実行に失敗することがあります。(17807439)
この問題が発生した場合は、システムを再起動し、コマンドラインから xcrun simctl erase <Device UDID> を実行して、デバイスをリセットして下さい。xcrun simctl list の出力をチェックすして、デバイスの UDID を得ることができます。(17042870)
iOS シミュレータは、認証が必要なネットワークプロキシサーバーの使用をサポートしていません。(14889876)
アプリ拡張機能
- 今日のアプリのデバッグ拡張機能は最初のデバッグセッションの後では信頼できません。
次のデバッグセッションを開始する前に、通知センターを閉じて下さい。(18051136)
Xcode 6.0.1 公開ノート
解決済みの問題
アプリの提出
- Xcode 6.0 の GM シードで遭遇する App Store の提出の問題が解決されました。(18444000)
Xcode 6.0 公開ノート
新機能
Swift 言語
Swift は、iOS の開発のための新たなオブジェクト指向プログラミング言語です。Swift は、現代的で、強力で、表現力があり、そして使いやすいです。
注意: OS X 用の Swift の開発は、この公開の時点でベータ版で利用可能な OS X のバージョン 10.10 SDK が必要です。詳細については、OS X 用の Swift のサポートを参照してください。
- Swift ですべての Cocoa Touch のフレームワークにアクセスできます。
- Swift コードは、高性能なアプリを作成するために高度な LLVM コンパイラによってコンパイルされ、最適化されます。
- Swift は、型推論に伴って型の安全性を増やし、ポインタへの直接アクセスを制限し、ARC を使用して自動的にメモリを管理して簡単に Swift を使用し、安全な、安定したソフトウェアを作成できるようにします。言語の安全性に関連するその他の機能は、強制的な変数の初期化を含み、オーバーフローを防ぐための自動協会チェック、デフォルトで break する条件文、そしてデフォルトでメモリへの直接のポインタの排除が含まれています。
- 書き、デバッグし、および出来るだけ少ないコードを維持し、書くのが簡単で構文を読むのも簡単、およびヘッダー保守がありません。
- Swift は optionals、ジェネリック(汎用)、クロージャ、タプル、および他の現代的な言語機能を含んでいます。Objective-C に鼓舞され、改善して、Swift コードは読み書きするのが自然な感じがします。
- Swift は相互にアイデアを試してみると瞬時に結果を表示します。
- Swift は、C と Objective-C 言語の両方の完全な代替品です。Swift は完全なオブジェクト指向の機能を提供し、型、フロー制御、および演算子などの低レベル言語プリミティブを含んでいます。
Swift をサポートしている Xcode 6 の特長
- プレイグラウンドでは、アイデアをテストしたり、プロトタイプなどのために Swift を実験することができる、対話型開発環境です。プレイグラウンドのためのいくつかの用途は、次のとおりです。
- グラフィカルにリッチで対話的な環境でのチュートリアルから学ぶプレイグラウンドで、選択した文書を開くことができます。
- Xcode でのデバッグコンソールは LLDB にビルドされた Swift 言語の read-eval-print ループ (REPL) の対話的なバージョンを含んでいます。実行中のアプリと対話し、評価するのに Swift の構文を使い、または、スクリプトのような環境での動作を確認するために新しいコードを記述するスウィフト構文を書きます。REPL は、Xcode のコンソール内から、または実行中のプロセスに結合した場合、ターミナル内から LLDB を使用して利用可能です。
- Xcode のドキュメントビューアはあなたの選択した-Objective-C か、Swift、または両方の言語でのクイックヘルプまたはリファレンスドキュメントを示します。
- Swift コードから SDK のコンテンツに「定義へジャンプ(jump-to-definition)」を使用する場合には Xcode は SDK の API の Swift ビューを合成します。合成されたインタフェースは、API がどのように Swift にインポートされるかの方法を示し、それは、元の SDK のヘッダーからすべてのコメントを保持します。
新しいアルゴリズムの設計、方法のあらゆるステップの結果を見ている
新しい API を実験したり、新しい Swift 構文を試す
新しいテストを作成し、テストスイートにそれらを促進する前に、それらが動作することを検証する
Xcode 6 IDE の追加の機能拡張
テスト
- XCTest フレームワークは、アプリの各部分を定量化することを可能にするパフォーマンス測定機能をサポートしています。Xcode はパフォーマンステストを実行し、ベースライン·パフォーマンス·メトリックを定義することができます。後続の各テストは、パフォーマンスの比較を実行して、経時変化を表示します。
- XCTest フレームワークの新しい API は、非同期的に実行されるテストコードを許可します。これで、ネットワークの運用、ファイルの I/O、また非同期呼び出しを使用して実行する、他のシステムとの相互作用のテストを作成できます。
Interface Builder
- Interface Builder は、アプリの実行時に、それらが表示されるとおりに、デザイン時に、カスタムオブジェクトを表示するためには、ライブのレンダリングを使用して下さい。カスタムビューのコードを更新すると、Interface Builder の設計キャンバスはソースエディタに入力した新しい外観で自動的に更新しますが、ビルドして実行する必要はありません。
- iOS 8 のサイズクラスは、iPhone と iPad の両方のためにカスタマイズされたレイアウトで一つのユニバーサル・ストーリーボードを設計可能にします。サイズクラスを使用すると、一度で共通したビューと制約を定義できますし、サポートされている各フォームファクタのためのバリエーションを追加できます。iOS シミュレータとアセットカタログは、サイズクラスも完全にサポートします。
- Interface Builder は正しい寸法で、完成したアプリがどのように見えるかについての、より正確なプレビューを与え、設計時に、埋め込まれたカスタム iOS のフォントをレンダリングします。
- 検索し、発見は Interface Builder を使用した場合 .xib と .storyboard ファイルでサポートされています。
- プレビューエディタは、複数のプレビューとズームを提示する機能を含んでいます。
アセット·カタログ
- サイズクラス、JPEG、PDF、テンプレート画像、及びアライメントの長方形は、現在アセットカタログでサポートされています。
デバッガ
- ビューデバッガを使用して、一回ボタンをクリックすると、実行中のアプリを中止し、ビューのスタックの各層を分離する 3D レンダリングに一時停止の UI を、「爆発」します。ビューデバッガを使用すると、画像がクリップされ、目に見えなくなっても簡単に見えるようになり、そしてグラフィック要素の順序が明確になります。全てのビューを選択することで、アシスタントエディターのソースビューで該当するコードにジャンプして詳細を調べることができます。ビューデバッガも、コンフリクトが問題を起こす原因を検索可能にする領域を作る、自動レイアウトの制約も表示します。
- デバッグナビゲーター・キューデバッガは、最近実行されたブロックだけでなく、キューに入れられたブロックも記録し、表示するように強化されています。キューに入れられたブロックがどこにあるか見るためにそれを使用することができますし、実行するように設定されているのかを詳細に検討できます。
- デバッグゲージは、これまで知られていない問題に、開発者の注意を呼び、デバッグ中のリソース使用に関する一目でわかる情報を提供します。
アプリの実行中に二つの新しいゲージが追加され、それはネットワークの活動性およびファイルの活動性であり、視覚的に入力/出力の活動性のスパイクを強調表示します。
iCloud のゲージは、更新され、アプリ固有のコンテナの外側にあるファイルへのアクセスを提供する新しいクラウドと CloudKit 内の新しいドキュメントのサポートをします。
GPU ツール
- メタルは、新しく低いオーバーヘッドの GPU グラフィックスとコンピューティング API だけでなく、iOS 用のシェーディング言語を用意します。メタルシェーダコンパイラは、Xcode でメタルシェーダをプリコンパイルするためのサポートを追加しています。GPU のフレームデバッガとシェーダプロファイラは、メタル系のゲームやアプリのデバッグおよびプロファイリングをサポートしています。
スプライトキット
- SpriteKit(スプライトキット) レベルの設計者は、SpriteKit の利用を強化し、デバッグする時 SpriteKit 変数の表示を改善して提供します。
- SpriteKit と SceneKit は現在、一緒に動作するように拡張され、iOS でサポートされています。
拡張機能とフレームワーク
- iOS 内の他のアプリへアプリの機能を拡張するためにすべての iOS の、または Mac のアプリに拡張ターゲットを追加できます。
- iOS の開発者は、今や動的なフレームワークを作成できます。
iOS シミュレーター
- 新しい iOS シミュレータの構成では、一緒にグループ化されたデータと構成設定を保持することができます。 独自のデータと、一つのアプリの一バージョンに一構成、および異なるアプリのバージョンに別の構成を実行します。
ローカライズ
- Xcode はローカライズのための業界標準の XLIFF 形式にあなたのローカライズ可能な文字列をパッケージ化できます。
- Xcode は自動的にソースコードから直接基本言語 .strings ファイルを生成し、生成します。
- Interface Builder で設計している間、インタフェースは他の言語でどのように表示されるかを、プレビューアシスタントが表示できます。
- 他の国の顧客に見えるように、Xcode は、iOS シミュレータで、または直接デバイス上でアプリを実行するロケールを使用できます。
コンパイラ
- プロファイルに基づく最適化 (PGO) は LLVM オプティマイザと XCTest テストで動作し、アプリケーションの最も活発に使用される部分をプロファイルします。また、最適化プロファイルを生成するために、手動でアプリを行使できます。PGO は、さらにアプリを最適化し、最適化を最も必要とする分野をターゲットにし、最適化オプションを設定するだけでは達成できないものを超えた性能を改善するために、プロファイルを使用します。
- 開発者は、より簡単にすべてのプロジェクトで共有するフレームワークを作り、独自の Objective-C のコード用のモジュールを定義できます。
インストルメント
- 新しいインストルメントのユーザーインターフェイスは簡単にパフォーマンスチューニングセッションを設定できますし、コントロールを改善します。新しいテンプレートセレクタは、デバイスとターゲットだけでなく、プロファイリングセッションの開始点を選択できます。トラックビューは、直接クリック&ドラッグして時間フィルタの範囲を設定できます。ツールバーでは、手近のタスクに集中させるために、より少ないスペースを占めています。記録されたデータのトラックは、より多くのスペースが与えられ、データが収集され、視聴されている方法の構成は、統一されたインスペクター領域で管理されています。
- 機能テストのメモリリークを分析するか、それが退行した理由を確認するために性能テストをプロファイリングするために有用な全てのテストやテストスイートを、プロファイリングできます。
- シミュレーションの設定は、起動したり、シミュレータ内のプロセスにアタッチすることが容易になり、インストルメントによるデバイスのように今は扱われます。
- カウンターとイベントのインストルメントは、より強力なカウンターのインストルメントに結びつけられ、設定が容易になっています。これは、個々の CPU のイベントを追跡したり、イベントの集合体、比などを測定するための式を指定することができます。64 ビットデバイス上での iOS 開発者は、アプリを微調整するためにカウンタを使用できます。
- インストルメントは、割り当て (Allocation) のスタックの追跡と Swift の型で Swift のシンボルを表示して、Swift をサポートしています。また、アプリの拡張機能をプロファイルするためにインストルメントを使用できます。
Xcode サーバー
- トリガーは、Xcode のスキームを実行する前または後にカスタムスクリプトを起動するために、サーバー側のルールを設定することで、より複雑な統合シナリオを作成することができます。
- Xcode のサーバーは、簡単にチームが継続的なパフォーマンステストのためのデバイスと Mac のグループを共有できるようにして、新しい Xcode のパフォーマンス·テスト機能をサポートしています。
- 問題は現在統合ごとに追跡され、いつ問題が生じ、いつ修復されたか、を見る事ができるようにデルタ追跡を可能にしています。
- Xcode サーバー内の構成オプションは、開発チームからのボットの実行をより大きく制御を与えられます。統合期間、ボットのグループ化、および iOS シミュレータの構成のための新しい設定は、Xcode のボットをより強力にします。新しいレポートの UI は、ボットレベルの統計情報、成功した統合の回数を含み、追加の追跡をコミットし、およびテストします。
ノート
OS X 用 Swift サポート
- Xcode の、将来 OS X ヨセミテと一緒に公開されるバージョンでは、プレイグラウンドや REPL を含め、OS X 用 Swift のサポートを追加するでしょう。Xcode 6.0 のみが iOS プロジェクトやプレイグラウンドのため Swift をサポートしています。OS X と iOS 用両方の Swift をサポートする Xcodeのベータリリースは developer.apple.com/xcode/downloads/ で利用可能です。
Swift 言語
- 戻り値が誤って null の可能性がないと考慮した API メソッド、または間違って null の可能性がないと考えられているプロパティに遭遇した場合は、レーダーを提出し、件名に "#IUO" のタグを記載してください。すぐに、optional で結果を包むことによって、問題を回避することができます。
var fooOpt: NSFoo? = object.reallyMightReturnNil() if let foo = fooOpt { … }
これらの場合についてのバグを提出するようにしてください。まだ T! としてマークされている API についての機能要求を提出しないでください。私たちはそれらについて知っています。
Swift のための Xcode の特長
- Swift でリファクタリングすることはできません。
コンパイラ
- Xcode 6 の libc++ ヘッダは、std::pair が持つ些細なコンストラクタを作るようにする変更を含んでいます。この修正は、C++ 標準のパフォーマンスとコンプライアンスのために重要ですが、それは std::pair を使用して C++ コード用の ABI を変更します。
この問題は、そのライブラリがその API の std::pair のいずれかの用途を公開していないため、OS X と iOS のシステムにインストールされている libc++ ライブラリには影響しません。それだけが、独自のコードと、リンクするあるサードパーティのライブラリのための関心事です。すべてのコードが、libc++ と同じバージョンでビルドされている限り、問題はないでしょう。
libc++ の以前のバージョンとのバイナリ互換性を維持する必要がある場合は、 _LIBCPP_TRIVIAL_PAIR_COPY_CTOR マクロをゼロに定義する事で、古い ABI をビルドする事を選択し、すなわち、コンパイラオプションに -D_LIBCPP_TRIVIAL_PAIR_COPY_CTOR=0 を追加する事ができます。(15474572)
ビルドシステム
- Xcode は、もはや静的ライブラリをビルドする際に、ビルド設定で libtool に OTHER_LDFLAGS をオプションで渡しませんし、また他の種類のプロダクトをビルドする際には、Mach-O リンカーに OTHER_LIBTOOLFLAGS のオプションを渡しません。以前は両方の設定ですべてのオプションは、両方のツールで渡される設定になっていました。オプションが、プロダクトの種類、静的ライブラリ、またはビルドされている他のコンポーネントのビルド設定が正しいことを確認してください。(4285249)
- それらがコピーされるとき、現在のターゲットのプロダクトにバンドルされた、組み込まれたファイルのコピーのビルドフェーズに追加されたバンドル (フレームワーク、アプリケーション、および他のバンドルを含む) は、Headers と PrivateHeaders ディレクトリが削除するでしょう。これは、エンドユーザーに誤って出荷されていない、組み込まれたバンドルでそのヘッダーの内容を確認するために行われます。これは、既にあるプロジェクトでのファイルのコピーのビルド·フェーズにあるような項目には影響しません。この変更は、正確に Headers または PrivateHeaders という名前のコピーされている項目内の全てのファイルまたはディレクトリに影響します。
この動作からターゲットを外すように、REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES ビルド設定を YES に設定します。この動作に既存のターゲットを入れるには、問題になっているファイルのコピーのビルドフェーズに必要なファイル参照を削除、再度追加して下さい。
検索ナビゲーター
- 検索ナビゲータの正規表現を使用する場合は、複数行にまたがる一致の検索も可能になりました。メタ文字 "." はまだ改行を除外しますが、文字クラスは、たとえば、"[\D\d] "のようなすべての文字を含みます。(11393323)
- 検索ナビゲータの正規表現を使用する場合は、"\1 "構文は、もはや置換文字列ではサポートされません。キャプチャされたグループを参照するには、"$123" 構文を使用して下さい。
この変更により、数字をエスケープすることを超えて、十番目のキャプチャされたグループの後に、例えば "$10\2." の数字を挿入することができます。同様に、パターンを使用してテキストを検索する際に、十番目のパターンの後に数字を挿入できます。(11836632)
起動画面
- XIBs とストーリーボードは今や、起動画面として使用することができます。アプリケーションは、制約とサイズクラスを使用してさまざまな画面サイズに適応する一つの起動画面を提供するために、この機能を利用することが出来ます。これらの起動画面は、iOS8.0 以降でサポートされています。
iOS 7.x 以前のリリースをターゲットとするアプリケーションは、アセットカタログを経由して、伝統的な起動 PNGs を指定する必要があります。iOS 7 以前の起動 PNG がなくても、アプリケーションは、レティナ 3.5"、及びレティナ 4" ディスプレイ上の互換モードで実行します。(18000959)
iOS 上のフレームワーク
- 組み込みフレームワークと dylibs は iOS 8 以降のみでサポートされています。
アプリが以前の iOS リリースに配備した場合は、自動リンクをオフにしてください。 OS のバージョンチェックを実行した後に dlopen() を使ってフレームワークや dylibs をロードして下さい。(18140501)
ハードウェア IO ツール
- developer.apple.com で入手可能な Xcode のハードウェア IO ツール パッケージは、現在以下のアプリを含んでいます。
プリンタシミュレータ
HomeKit アクセサリーシミュレータ
(17014426、17014426、17738621)
- 以下の三つのアプリは、今回公開した Xcode のハードウェア IO ツール パッケージダウンロードから削除されています。
アップルの Bluetooth ガイドラインの検証
Bluetooth のエクスプローラ
PacketLogger
(18162817)
Xcode サーバー
- Xcode は今や SSH キーを使用して、ソース管理リポジトリで認証するボットを設定することができるようになりました。(16512381)
- Xcode サーバーは、利用可能なディスク容量に基づいて古い統合データを取り除きます。(16535845)
Xcodebuild
- xcodebuild は現在、iOS シミュレータ先指定子の id オプションをサポートしています。Xcode 5 では、このオプションは、iOS デバイス先指定子のためにのみ利用可能でした。(17398965)
既知の問題
アプリの提出
- App Store に提出するとき、Xcode 6.0 GM の子孫は、問題に遭遇することがあります。これらの問題は、Xcode の今後のリリースで解決されます。(18344000)
Swift 言語
- enum は、別のファイルで宣言されている場合、関係オペレータ == は、enum 値では動作しない場合があります。
- AnyObject として型指定された値のプロパティに、直接に代入できないことがあります。
(X == .Value) の代わりに !(x != .Value) を使用して下さい。(18073705)
'AnyObject' の型の値を意図された型にキャストして、別の値に格納し、その後その値のプロパティに直接代入しま。例えば:
var mc: MyClass = someAnyObject as MyClass mc.foo = “reassign"
- Swift はヌルを返すことで失敗するオブジェクトイニシャライザをサポートしていません。
(15233922)
ファクトリメソッドが存在する場合、代わりにこれを使用して下さい。それ以外の場合は、オプションで結果をキャプチャして下さい。例えば:
- 同じモジュール内の異なるファイルに定義されている場合でも、同じ名前と同じ型を持つ private な実在はコンフリクトします。(17632175)
- 再帰的に自分自身または同じ外側の関数にネストされている他の関数を参照するネストされた関数では、コンパイラがクラッシュします。例えば:
(16480364)
func foo() { func bar() { bar() } func zim() { zang() } func zang() { zim() } }
- 汎用クラスは、汎用型で格納されたプロパティを定義することができ、つまり、汎用クラスが @objc としてマークされていない、または Objective-C クラスからサブクラス化されている Objective-C に利用できるようにされていない限り、汎用クラスは定義できます。たとえば、これは有効です。
外側の型またはモジュールの文脈に再帰関数を移動して下さい。(11266246)
class Box<T> { // "value" is a stored property whose type is the generic type parameter T let value: T init(value: T) { self.value = value } }
Objective-C にこのようなクラスを利用できるようにする必要がある場合は、保管のための配列を使用して下さい。
@objc class ObjCBox<T> { let _value: T[] var value: T { return _value[0] } }
- Swift の Dictionary をキーとして Int64 または UInt64 型タイプでを使用すると、その値は Int32 で表現できないキーを挿入しようとしたとき、32 ビットプラットフォーム上ではトラップが発生します。
(16737510)
キータイプとして NSNumber を使用してください。(18113807)
プレイグラウンド
- プレイグラウンドでは、println() は、ユーザー定義型の Printable な準拠を無視します。(16562388)
- iOS のプレイグラウンドは、XCPShowView()XCPlayground の API でのアニメーションビューの表示をサポートしていません。(17848651)
コンパイラ
- 古いコンパイラでコンパイルされた C++ コードをリンクしようとしたとき float16_t 型を使用した ARM および ARM64 コードは失敗することがあります。コンパイラの以前のバージョンでは、float16_t は uint16_t と定義されていました。float16_t は現在 __fp16 として定義されています。(15506420)
デバッガ
- デバッガで Swift のデータ構造体のためのビュー·メモリはメモリ位置ゼロを表示することがあります。
UnsafePointer<Void> への参照を期待して関数に構造体を渡すと、関数内でそれを印刷します。表示するには、メモリの位置として、このアドレスを入力してください。(17818703)
Interface Builder
- 結合の値変換として NSValueTransformer の Swift のサブクラスを設定した場合は、XIB やストーリーボードは、クラスへの無効な参照を含み、結合は、実行時に正常に動作しません。
- Interface Builder はアウトレットタイプがプロトコルの時、Swift ファイル内のアウトレットに接続するのはサポートしていません。
- Objective-C からカスタムクラスを Swift に移植した後、XIB やストーリーボードのクラスへの全ての参照は手動で更新する必要があります。
- UICollectionViewCell のコンテンツビューのサイズの実装は、iOS 8 で変更されています。iOS 7 に Xcode 6 でビルドされたコレクションビューセルを配置する場合、セルのコンテンツビューのサイズは、自動サイズ変更マスクを持っていません。これは、望ましくないレイアウトをもたらします。
Value Transformer フィールドにぐちゃぐちゃのクラス名を入力するか、NSValueTransformer サブクラスに @objc(...) 属性を追加して下さい。(17495784)
Interface Builder を使用して AnyObject または NSObject のようなアウトレット型を宣言し、アウトレットにオブジェクトを接続すると、その後アウトレットがプロトコルの型に戻ります。(17023935)
それぞれの参照を選択し、カスタムクラスインスペクタで Class のフィールドをクリアし、保存し、クラス名を再入力して下さい。(17153630)
iOS 8 以前の iOS のバージョンのコレクションビューを適切に展開するための自動サイズ変更マスクを条件付きで設定する必要があります。以下のサンプルコードは、UICollectionViewCell のカスタムサブクラスでこれを回避する策を実装する方法を示します。
- (void)commonInit_MyCollectionViewCell { if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedDescending) { [[self contentView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; } } - (id)initWithCoder:(NSCoder *)coder { if (self = [super initWithCoder:coder]) { [self commonInit_MyCollectionViewCell]; } return self; } - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self commonInit_MyCollectionViewCell]; } return self; }
- Interface Builder iOS 文書で設計可能なサブクラス内で (たとえば、-intrinsicContentSize) のカスタムジオメトリオーバーライドを示しているだけです。(17024838)
(18338361)
ローカライズ
- 以下の3つの条件のすべてに該当する場合、ストーリーボードまたは XIB は正しくローカライズしません。
ストーリーボードまたは XIB がサイズクラスを使用している場合。
基本ローカライズとビルドターゲットが、Universal に設定されている場合。
ビルドが、iOS 7.0 をターゲットとしている場合。
- プロジェクトエディタのアプリケーションターゲットを選択し、[Build Phase(ビルドフェーズ)]タブに移動します。
- 以下の内容で、新しい実行スクリプトのフェーズを追加します。
影響を受けたストーリーボードや XIBs で使用される各文字列ファイルの ~iPhone や ~iPad 変異体を追加することで、この問題を回避することができます。以下の操作を行って、ビルドフェーズでこの操作を自動化できます。
# Go to the app bundle. cd "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" for f in "$PWD"/*.lproj/*.strings; do # If the .strings file name doesn't already specify a device... name=$(basename "$f" .strings) if [[ "${name%%~iphone}" == "$name" && "${name%%~ipad}" == "$name" ]]; then # If there is a corresponding .nib in Base.lproj... if [[ -e "Base.lproj/$name~iphone.nib" ]]; then # Symlink the device-qualified file name to the unqualified file. ln -sf "$f" "${f/%.strings/~iphone.strings}" fi # Do likewise for iPad. if [[ -e "Base.lproj/$name~ipad.nib" ]]; then ln -sf "$f" "${f/%.strings/~ipad.strings}" fi fi done
(18087788)
アプリの機能拡張
- 署名された OS X アプリの機能拡張は dyld の警告を発すると、起動に失敗することがあります。
- ファイルプロバイダで iOS のドキュメントピッカー機能拡張を作成すると、結果として得られるアプリグループを含有するアプリを追加しません。
同じチーム ID はアプリの機能拡張と、アプリを含む両方に設定されていることを確認して下さい。(17711503)
手動でアプリグループに、含むアプリを追加して下さい。(16871267)
アセットカタログ
- ビルドターゲットの唯一の資産がアセット (資産) カタログにのみある場合は、ビルドは ".../Contents/Resources" does not exist." エラーで失敗します。
ビルドターゲットにアセットでないカタログリソースを少なくとも一つ追加して下さい。(17848595)
リファクタリング
- Objective-C のクラスが Swift のサブクラスを有する場合には、リファクタリングエンジンは検出しません。
Objective-C のリファクタリングを行う場合、Swift のサブクラスで必要な変更は手動で行う必要があります。(16465974)
ビルド
- Swift を使ったアプリの機能拡張の増分ビルドは、コード署名エラーで失敗します。
- ヘッダが変更された後には、Swift と Objective-C の混合したプロジェクトは、完全に再度ビルドしない場合があります。
この問題を回避するために、[Product(製品)] > [Clean(クリーン)] を選択し、再度ビルドして下さい。(17589793)
この問題を回避するために、[Product] > [Clean] を選択し、再度ビルドして下さい。(17963128)
ビルドシステム
- バンドルの中の Swift 標準ライブラリを埋め込むビルドステップは、アプリケーションのプロダクトタイプについてのみ実行され、全ての埋め込みコンテンツの独立したアプリケーション自体が、Swift のソースファイルを含む場合のみに実行する。
Swift コードが含まれている、Swift ソースファイルを含んでおらず (フレームワーク、XPC サービス、アプリの拡張機能、などなどのように) その他のコンテンツを埋め込んでいるアプリケーションをビルドする場合、埋め込まれたコンテンツの Swift コードを含むビルド設定 (Embedded Content Contains Swift Code) を設定する必要があります (EMBEDDED_CONTENT_CONTAINS_SWIFT)。その方法が、Swift ライブラリがアプリケーションに含まれる方法です。(17757566)
Xcode サーバー
- Xcode 6 にアップグレードした後、ユーザーは OS X サーバでの ADC の開発チームに再度参加する必要があります。(17789478)
iOS シミュレータ
- そのバンドル内の Xcode ツールのいずれかを実行した後 Xcode.app の名前を変更すると、iOS のシミュレータは、もはや利用できなくことがあります。
- iOS シミュレータ上でテストすると、アプリケーションをインストールまたは起動することができなかったことを示すエラーを生成することがあります。
- iOS シミュレータの設定アプリで変更した設定は持続しない可能性があります。(18238018)
- iOS シミュレータからアプリを削除しても、ユーザーのデフォルト設定を削除しません。(18307910)
最初に起動した時に戻って Xcode.app の名前を変更するか、お使いの Mac を再起動して下さい。(16646772)
テストを再度実行するか、別の統合を開始して下さい。(17733855)
ソース管理
- プロジェクトの参照が、時々チェックアウトしていない作業コピーである場合、Xcode でソース管理メニューを開くと、クラッシュします。
- ローカルの変更と Subversion の作業コピーを更新し、入ってくる変更は開いているプロジェクトファイル (project.pbxproj) を変更し、Xcode を再起動するまで、更新前の変更されたファイルのステータスアイコンが表示されない場合があります。
プロジェクト内の .xccheckout ファイルを削除して下さい。(17905354)
Xcode を再起動して下さい。(18122757)
テスト
- XCTest クラスファイルテンプレートは、OS X のプロジェクトのための実装言語として Swift を使用してテストクラスを作成することができます。しかし、Xcode のバージョン 6.0 は、OS X での Swift の開発をサポートしていません。Xcode 6.0 で OS X のテストターゲットに Swift のテストクラスをビルドしようとするとコンパイルエラーになります。(18107068)
- デッドコードのストリッピングは、Swift アプリケーションターゲットからテストクラスの実装に必要な public 宣言を削除することがあります。
- Objective-C で書かれた XCTest テストクラスは、アプリケーションのターゲットの、 Swift が生成したインタフェースヘッダ ($(PRODUCT_MODULE_NAME)-Swift.h) をインポートはできず、このヘッダーを必要とするコードをテストするために使用することはできません。
テストをビルドしている構成でデッドコードのストリッピングをオフにして下さい。(18173029)
Swift で Swift コードのテストクラスを記述して下さい。フレームワークターゲットのために Objective-C で書かれたテストクラスは、@import FrameworkName を使用してフレームワークモジュールをインポートすることで、Swift が生成したインターフェイスをアクセスすることができます。(16931027)
旧式
Carbon Tool
- カーボンの開発をサポートするツールは、Xcode 6 では旧式です。これらは、 BuildStrings, GetFileInfo, SplitForks, ResMerger, UnRezWack, MergePef, RezWack, SetFile, RezDet, CpMac, DeRez, MvMac, 及び Rez を含んでいます (10344338)
OCUnit と SenTestingKit.framework
- OCUnit と SenTestingKit フレームワークは旧式で、Xcode の将来のリリースから削除されるでしょう。OCUnit を使用したソースコードは、コンパイル中に警告が生成されます。開発者は、[Edit(編集)] > [Refactor(リファクタリング)] > [Convert to XCTest(XCTest に変換)] を使用して、XCTes tに移行する必要があります。詳細については、Xcode でのテスト を参照してください。
前:Xcode 公開ノート
次:Xcode 5 公開ノート