うまく組み合わせる(part III)


同じプロジェクトでの Swift と Objective-C


Objective-C との Swift の互換性により、どちらかの言語で書かれたファイルを含むプロジェクトを作成できるようになります。言語が混在したコードベースを持っているアプリを書くためには、この機能、mix and match (うまく組み合わせる) と呼ばれる特徴を使用できます。うまく組み合わせると、最新の Swift の機能を使用して、アプリの機能の一部を実装して、シームレスに既存の Objective-C のコードベースに戻すことができます。


「うまく組み合わせる」概観


Objective-C と Swift のファイルは、プロジェクトが元々 Objective-C または Swift プロジェクトであっても、単一のプロジェクトで共存することができます。既存のプロジェクトに直接他の言語のファイルを単に追加することができます。この自然なワークフローは、単一の言語で書かれたアプリやフレームワークのターゲットを作成することと同じく簡単で、言語が混在したアプリやフレームワークのターゲットを作成できます。


言語が混在したターゲットで作業するプロセスは、あなたがアプリを書いているかフレームワークを書いているかによってわずかに異なります。同じターゲット内で両方の言語で作業するための一般的な import モデルは下の図に示されており、以下の節で詳しく説明しています。



DAG_2x

同じアプリターゲット内からコードを import


言語の混じったアプリを書いている場合は、Swift から Objective-C のコードにアクセスし、Objective-C から Swift のコードにアクセスする必要があります。この節で説明するプロセスは、フレームワークでないターゲットに適用されます。


Objective-C から Swift への import


Swift コードと同じアプリターゲットにある Objective-C のファイルのセットを import するには、Swft にそれらのファイルを公開する Objective-C ブリッジヘッダ に依頼しましょう。Xcode は既存の Objective-C アプリに Swift ファイル、または既存の Swift アプリに Objective-C ファイルを追加するときに、このヘッダファイルを作成するために提案します。



bridgingheader_2x


同意する場合、Xcode は作成していたファイルとともにヘッダーファイルを作成し、製品モジュール名の後に "-Bridging-Header.h" を追加します。(製品モジュール名の詳細については、後で プロダクトモジュールの命名 で学びます。)


代わりに、[File]> [New]> [File]> [(iOS,watchOS,tvOS または mac OS)]>[Source]>[Header File] を選択することで、ご自分でブリッジヘッダを作成することもできます。


Swift コードに Objective-C コードを公開するためのブリッジヘッダファイルを編集する必要があります。


同じターゲットから Swift に Objective-C コードを import するには


  1. Objective-C のブリッジヘッダファイルでは、Swift に公開したいすべての Objective-C ヘッダを import して下さい。たとえば、以下のように:

    1. <<OBJECTIVE-C>>

    2. #import "XYZCustomCell.h"
    3. #import "XYZCustomView.h"
    4. #import "XYZCustomViewController.h"


  2. [Build Settings] で、[Swift Compiler - Code Generation] で [Objective-C Bridging Header] ビルド設定がブリッジヘッダへのパスであるのを確認して下さい。

    パスは、Info.plist のパスが [Build Setting(ビルド設定)] で指定されている方法と同様に、プロジェクトへの相対パスである必要があります。ほとんどの場合、この設定を変更する必要はありません。


このブリッジヘッダファイルにリストされているすべての public の Objective-C ヘッダは、Swift に表示されます。Objective-C の機能は、import 文なしで、自動的にそのターゲット内の任意の Swift ファイルで利用できるようになります。システムクラスで使用するものと同じ Swift 構文でカスタム Objective-C のコードを使用して下さい。


    << SWIFT >>

  1. let myCell = XYZCustomCell()
  2. myCell.subtitle = "A custom cell"


Swift から Objective-C への import


Swift コードから Objective-C に import するときには、Objective-C にそれらのファイルを公開するように Xcode で生成されたヘッダ ファイルに依頼します。この自動的に生成されたファイルは、ターゲット内の Swift インタフェースを宣言する Objective-C ヘッダです。それは Swift コードのアンブレラヘッダと考えることができます。このヘッダの名前はプロダクトモジュールの名前の後に "-Swift.h" が続く名前です。(プロダクトモジュールの命名については、後で プロダクトモジュールの命名 で詳細を学びます。)


デフォルトでは、生成されたヘッダは、public または open 修飾子でマークされた Swift 宣言用のインタフェースを含んでいます。また、アプリのターゲットに Objective-C のブリッジヘッダがある場合は、internal 修飾子でマークされたものも含みます。private または fileprivate 修飾子でマークされた宣言は生成されたヘッダには現れません。これらは明示的に @IBAction、@IBOutlet、または @objc でマークされない限り、private 宣言は、Objective-C には公開されません。あなたのアプリターゲットがテストが有効になるようにコンパイルされている場合、ユニットテストターゲットは、public 修飾子で宣言されていて、@testable をプロダクトモジュールの import 文に用意することによって宣言されているかのように、internal 修飾子で全ての宣言にアクセスできます。


アクセスレベルの修飾子の詳細については、Swift プログラミング言語(Swift 4.0.3)アクセス制御 を参照してください。


生成されたヘッダファイル、つまりちょうど Objective-C コードでその内容を使用するように import したものを作成するためには特別なものを何も作成する必要はありません。生成されたヘッダ内の Swift インターフェイスがそれらに使用される Objective-C 型へのすべての参照を含んでいることに注意してください。Swift コードで Objective-C の独自の型を使用する場合は、それから Swift コードにアクセスしたい Objective-C .m ファイルに、Swift が作成したヘッダを import する前に、それらの型のための Objective-C ヘッダを確実に import して下さい。


同じターゲットから Objective-C に Swift コードを import するには


ターゲット内の Swift ファイルは、この import 文を含む Objective-C の .m ファイルに表示されます。Objective-C コードから Swift を使用する方法については、Objective-C からの Swift の使い方 を参照してください。


Swift へのインポートObjective-C へのインポート
Swift コードimport 文なし#import "ProductModuleName-Swift.h"
Objective-C コードimport 文なし; Objective-C ブリッジヘッダ必要#import "Header.h"


同じフレームワークターゲット内からコードを import


言語の混じったフレームワークを書いている場合は、Swift から Objective-C のコードにアクセスし、Objective-C から Swift コードにアクセスする必要があります。


Objective-C から Swift への import


Swift コードと同じフレームワークターゲットに Objective-C ファイルのセットを import するには、フレームワークの Objective-C のアンブレラヘッダにそれらのファイルを import する必要があります。


同じフレームワークから Swift に Objective-C コードを import するには


  1. [Build Setting(ビルド設定)]で、パッケージに、そのフレームワークターゲットの定義モジュールの設定が "Yes" に設定されていることを確認してください。
  2. あなたのアンブレラヘッダファイルで、Swift に公開したいすべての Objective-C のヘッダを import します。たとえば、次のように:


    1. <<OBJECTIVE-C>>

    2. #import <XYZ/XYZCustomCell.h>
    3. #import <XYZ/XYZCustomView.h>
    4. #import <XYZ/XYZCustomViewController.h>


Swift では、アンブレラヘッダで public に公開する全てのヘッダが現れます。そのフレームワークの中の Objective-C ファイルの内容は、全く import 文なしで、そのフレームワークターゲット内の任意の Swift ファイルで自動的に利用できるようになります。システムクラスで使用するものと同じ Swift の構文でカスタムの Objective-C のコードを使用して下さい。



    << SWIFT >>

  1. let myOtherCell = XYZCustomCell()
  2. myOtherCell.subtitle = "Another custom cell"


Swift から Objective-C への import


Objective-C コードと同じフレームワークターゲットに Swift ファイルのセットを import するには、フレームワークのアンブレラヘッダには何も import する必要はありません。その代わりに、それから Swift コードを使用したい全ての Objective-C の .m のファイルに Swift コード用に Xcode が生成したヘッダファイルを import します。


フレームワークターゲットのために生成されたヘッダは、フレームワークの public のインターフェイスの一部であるため、public または open 修飾子でマークされた宣言だけが、フレームワークターゲットのために生成されたヘッダに表示されます。


internal 修飾子でマークされ、Objective-C クラスから継承したクラス内で宣言された Swift メソッドおよびプロパティは、Objective-C 実行環境にアクセスできます。ただし、コンパイル時にはアクセスできず、フレームワークターゲット用に生成されたヘッダには表示されません。


アクセスレベルの修飾子の詳細については、Swift プログラミング言語(Swift 4.0.3)アクセス制御 を参照してください。


同じフレームワークから Objective-C の中に Swift コードを import するには


  1. [Build Setting]で、[Packaging]に、そのフレームワークターゲットの [Defines Module] 設定が、[YES] に設定してあるのを確認して下さい。
  2. そのフレームワークターゲットから、Swift コードを任意の Objective-C の .m ファイルに次の構文を使用し、適切な名前に置き換えて import します。

    1. <<OBJECTIVE-C>>

      "#import <ProductName/ProductModuleName-Swift.h>



フレームワーク・ターゲット内の Swift ファイルは、この import 文を含む Objective-C の .m ファイルに現れます。Objective-C コードから Swift を使用する方法については、Objective-C からの Swift の使い方 を参照してください。


Swift への importObject-C への import
Swift コードimport 文なし#import <ProductName/ProductModuleName-Swift.h>
Objective-C コードimport 文なし;Objective-C アンブレラヘッダ必要#import "Header.h"

外部フレームワークの import


純粋な Objective-C のコードベースを持つ、または純粋な Swift のコードベースを持つ、または言語の混じったコードベースを持っている外部のフレームワークを import することができます。外部のフレームワークを import するためのプロセスは、フレームワークが、単一の言語で書かれたか、または両方の言語のファイルを含んでいるかどうかと同じです。外部のフレームワークを import する時は、import しているフレームワークの定義モジュールのビルド設定が "Yes" に設定されていることを確認してください。


以下の構文を使用して、異なるターゲット内の Swift ファイルどれでもにフレームワークを import できます。


以下の構文を使用して、異なるターゲット内の Objective-C の .m ファイルどれでもにフレームワークを import できます。


Swift への importObjective-C への import
任意の言語のフレームワークimport FrameworkName@import FrameworkName;


Objective-C からの Swift の使い方


Objective-C に Swift コードを一度 import すると、Swift のクラスを操作するために通常の Objective-C の構文を使用できます。


    <<OBJECTIVE-C>>

  1. MySwiftClass *swiftObject = [[MySwiftClass alloc] init];
  2. [swiftObject swiftMethod];


Swift のクラスは Objective-C でアクセス可能で使用できるように、Objective-C クラスの子孫でなければなりません。Objective-C からアクセスできる情報と Swift インターフェイスの import 方法の詳細については、Swift の型の互換性 を参照してください。



Objective-C ヘッダでの Swift クラスまたはプロトコルの参照


あなたのコードが別のモジュールに由来する Swift クラスまたはプロトコルを参照する場合、Swift モジュールを @import を使用して Objective-C ヘッダにインポートして下さい。ただし、循環参照を避けるために、Swift コードを 同じ モジュール内から Objective-C ヘッダ (.h) ファイルに import しないでください。代わりに、Swift クラスまたはプロトコルを Objective-C インターフェイス内で参照するように前方宣言することができます。


    <<OBJECTIVE-C>>

  1. // MyObjcClass.h
  2. @class MySwiftClass;
  3. @protocol MySwiftProtocol;
  4. @interface MyObjcClass : NSObject
  5. - (MySwiftClass *)returnSwiftClassInstance;
  6. - (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
  7. // ...
  8. @end


Swift クラスとプロトコルの前方宣言は、メソッド宣言とプロパティ宣言の型としてのみ使用できます。


Objective-C クラスで採用可能な Swift プロトコルを宣言


Objective-C クラスが採用できる Swift プロトコルを作成するには、protocol 宣言を @objc 属性でマークします。


    << SWIFT >>

  1. @objc public protocol MySwiftProtocol {
  2.         func requiredMethod()
  3.         @objc optional func optionalMethod()
  4. }


プロトコルは、Objective-C クラスがプロトコルに準拠するために実装しなければならないすべてのイニシャライザ、プロパティ、サブスクリプト、およびメソッドを宣言します。optional のプロトコル要件は、@ objc 属性でマークし、optional の修飾子を付けなければなりません。


Objective-C の実装での Swift プロトコルの採用


Objective-C クラスは、Swift コード用の Xcode が生成したヘッダを import し、クラス拡張を使用して、実装(.m) ファイルで Swift プロトコルを採用できます。


    <<OBJECTIVE-C>>

  1. // MyObjcClass.m
  2. #import "ProductModuleName-Swift.h"
  3. @interface MyObjcClass () <MySwiftProtocol>
  4. // ...
  5. @end
  6. @implementation MyObjcClass
  7. // ...
  8. @end


Objective-C から使用できる Swift のエラー型の宣言


Error プロトコルに準拠し、@objc 属性で宣言された Swift の列挙型は、NS_ENUM 宣言と、生成されたヘッダ内の対応するエラードメインの NSString 定数を生成します。たとえば、以下の Swift 列挙型宣言があるとします。


    << SWIFT >>

  1. @objc public enum CustomError: Int, Error {
  2.         case a, b, c
  3. }


生成されたヘッダに対応する Objective-C の宣言は以下のとおりです。


    <<OBJECTIVE-C>>

  1. // Project-Swift.h
  2. typedef SWIFT_ENUM(NSInteger, CustomError) {
  3.     CustomErrorA = 0,
  4.     CustomErrorB = 1,
  5.     CustomErrorC = 2,
  6. };
  7. static NSString * const CustomErrorDomain = @"Project.CustomError";


Objective-C インターフェイス用に Swift 名をオーバーライド


Swift コンパイラは Objective-C コードを従来の Swift コードとして自動的に import します。Objective-C のクラスファクトリメソッドを Swift のイニシャライザとして import し、Objective-C 列挙型の case は名前を切り捨てます。


自動的に処理されない境界のケースがコード内にある可能性があります。Objective-C のメソッド、列挙型の case、またはオプション設定値の Swift によって import された名前を変更する必要がある場合は、 NS_SWIFT_NAME マクロを使用して宣言の import 方法をカスタマイズできます。


クラスファクトリメソッド


Swift コンパイラがクラスファクトリメソッドを識別するのを失敗した場合は、NS_SWIFT_NAME マクロを使用して、イニシャライザの Swift 署名を渡して、正しく import されるようにできます。 例えば:


    <<OBJECTIVE-C>>

    + (instancetype)recordWithRPM:(NSUInteger)RPM NS_SWIFT_NAME(init(RPM:));



Swift コンパイラがメソッドを誤ってクラスファクトリメソッドと識別した場合は、メソッドの Swift 署名を渡して正しく import するように NS_SWIFT_NAME マクロを使用できます。例えば:


    <<OBJECTIVE-C>>

    + (id)recordWithQuality:(double)quality NS_SWIFT_NAME(record(quality:));



列挙型


デフォルトでは、Swift は列挙型の値の名前接頭辞を切り捨てて列挙型を import します。列挙型の case の名前をカスタマイズするには、NS_SWIFT_NAME マクロを使用して Swift 列挙型の case 名を渡します。例えば:


    <<OBJECTIVE-C>>

  1. typedef NS_ENUM(NSInteger, ABCRecordSide) {
  2.     ABCRecordSideA,
  3.     ABCRecordSideB NS_SWIFT_NAME(FlipSide),
  4. };


Objective-C 宣言を洗練する


Objective-C メソッド宣言で NS_REFINED_FOR_SWIFT マクロを使用すると、拡張機能で洗練された Swift のインタフェースを提供し、元の実装を洗練されたインタフェースから呼び出す事ができます。たとえば、1つ以上のポインタ引数をとる Objective-C メソッドを、Swift で洗練して、値のタプルを返すことができます。


以下の Objective-C 宣言があるとします。


    <<OBJECTIVE-C>>

  1. @interface Color : NSObject
  2. - (void)getRed:(nullable CGFloat *)red
  3.                 green:(nullable CGFloat *)green
  4.                   blue:(nullable CGFloat *)blue
  5.                 alpha:(nullable CGFloat *)alpha NS_REFINED_FOR_SWIFT;
  6. @end


以下のように拡張機能内で、洗練された Swift インターフェースを提供することができます:


    << SWIFT >>

  1. extension Color {
  2.         var RGBA: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
  3.                 var r: CGFloat = 0.0
  4.                 var g: CGFloat = 0.0
  5.                 var b: CGFloat = 0.0
  6.                 var a: CGFloat = 0.0
  7.                 __getRed(red: &r, green: &g, blue: &b, alpha: &a)
  8.                 return (red: r, green: g, blue: b, alpha: a)
  9.         }
  10. }


Swift で Objective-C インターフェイスを使用できないようにする


Objective-C のインタフェースのいくつかは、Swift インタフェースとして公開するのに適していないものや、必要でないものもあります。Objective-C の宣言が Swift によって import されないようにするには、NS_SWIFT_UNAVAILABLE マクロを使用して API の使用者に、存在する代替案を指示するメッセージを渡します。


たとえば、キー値ペアの可変個数引数を取るコンビニエンスイニシャライザを提供する Objective-C クラスは、Swift の使用者に、代わりに辞書リテラルを使用するように助言するかもしれません:


    <<OBJECTIVE-C>>

    + (instancetype)collectionWithValues:(NSArray *)values forKeys:(NSArray<NSCopying>
    *)keys NS_SWIFT_UNAVAILABLE("Use a dictionary literal instead");



Swift コードから +collectionWithValues:forKeys: メソッドを呼び出そうとすると、コンパイラエラーが発生します。


Swift と Objective-C の両方でコンパイル時に Objective-C の宣言を使用できないようにするには、NS_UNAVAILABLE マクロを使用します。マクロは、カスタマイズ可能なエラーメッセージを省略し、Objective-C コードの宣言へのコンパイル時のアクセスを制限する点を除いて、NS_SWIFT_UNAVAILABLE マクロと同様に動作します。



Objective-C API へ利用可能性情報の追加


Swift では、@available 属性を使用して、特定のターゲットプラットフォーム用にアプリをビルドする際に宣言を使用できるかどうかを制御します。同様に、利用可能性条件 #available を使用して、必要なプラットフォームおよびバージョン条件に基づいて条件付きでコードを実行します。


両方の種類の利用可能性指定子は、以下の例に示す、対応する構文を使用して Objective-C で使用できます。


以下の例は、Swift の宣言で使用される利用可能性情報を示しています。


    << SWIFT >>

  1. @available(iOS 11, macOS 10.13, *)
  2. func newMethod() {
  3.         // Use iOS 11 APIs.
  4. }


Objective-C に同じ利用可能性情報を追加する方法は以下のとおりです。


    <<OBJECTIVE-C>>

  1. @interface MyViewController : UIViewController
  2. - (void) newMethod API_AVAILABLE(ios(11), macosx(10.13));
  3. @end


以下の例は、Swift の条件文で使用される利用可能性情報を示しています。


    << SWIFT >>

  1. if #available(iOS 11, *) {
  2.         // Use iOS 11 APIs.
  3. } else {
  4.         // Alternative code for earlier versions of iOS.
  5. }


Objective-C で同じ利用可能性情報を使用する方法は以下のとおりです。


    <<OBJECTIVE-C>>

  1. if (@available(iOS 11, *)) {
  2.         // Use iOS 11 APIs.
  3. } else {
  4.         // Alternative code for earlier versions of iOS.
  5. }


プラットフォームの利用可能性の特定に関する詳細については、Swiftプログラミング言語(Swift 4.0.3)宣言の属性 を参照してください。


プロダクトモジュールの命名


Swift コード用の、Xcode で生成されたヘッダの名前と Xcode が作成した Objective-C のブリッジヘッダの名前はあなたのプロダクトモジュールの名前から生成されます。デフォルトでは、プロダクトモジュールの名前は、プロダクトの名前と同じです。しかし、プロダクトの名前が、ピリオド(.) のような英数字以外の文字を持つ場合は、それらはプロダクトモジュールの名前ではアンダースコア(_) に置き換えられます。名前が数字で始まる場合、最初の数字はアンダースコアに置き換えられます。


また、プロダクトモジュールの名前にカスタムの名前も提供でき、ブリッジヘッダおよび生成されたヘッダに名前を付けるときに Xcode はこれを使用します。これを行うには、プロダクトモジュール名のビルド設定を変更して下さい。


注意: フレームワークのプロダクトモジュール名をオーバーライドすることはできません。


トラブルシューティングのヒントと注意





前:C の API との相互作用 次:Objective-C から Swift へのコードの移行
目次
Xcode の新機能

Swift:はじめに
Swift Programming Language
Swift Blog より

  • はじめに(Part I)
  • 基本設定
  • Swift 環境の設定
    Swift のインポートプロセスの理解
  • 相互運用性(Part II)
  • Objective-C API との相互作用
  • 初期化
  • クラスファクトリメソッドとコンビニエンスイニシャライザ
    失敗可能な初期化
    プロパティへのアクセス
    メソッドでの作業
  • id の互換性
  • Any のダウンキャスト
    動的なメソッドの参照
    認識されないセレクタと optional の連鎖
  • ヌル可能性 (Nullabity) と optionals
  • ヌル可能性のない (nonnullable) オブジェクトに Optional をブリッジする
    プロトコルで修飾されたクラス
    軽量級の汎用
    拡張機能
  • クロージャ
  • self をキャプチャする時の強い循環参照を回避する
  • オブジェクトの比較
  • Hash する
  • Swift の型の互換性
  • Objective-C で Swift インターフェースの構成
    動的な送出を要求
  • セレクタ
  • Objective-C メソッドの安全でない呼び出し
    キーとキーパス
  • Swift のクラスとプロトコルの書き方及び Objective-C の動作
  • Objective-C のクラスからの継承
  • NSCoding
    プロトコルの採用
    イニシャライザとデイニシャライザを書く
    Objective-C API で Swift クラス名を使用する
  • Interface Builder との統合
  • アウトレットとアクションを使った作業
    ライブレンダリング
  • プロパティ属性の指定
  • Strong と Weak
    読み/書き可能と読み取り専用
    コピーの意味
    コアデータ管理オブジェクトサブクラスの実装
    プロトコルの宣言
  • Cocoa フレームワークでの作業
  • Foundation
  • ブリッジ型
  • 名前の変更された型
  • 文字列

    配列
    セット
    Dictionary
  • Core Foundation
  • 再マッピングされた型
    メモリ管理オブジェクト
    管理されないオブジェクト
    統合ログオン
    Cocoa 構造体
  • Cocoa デザインパターンの採用
  • デリゲート化
    遅延した初期化
  • エラー処理
  • エラーの catch と処理
    エラーを Optional の値に変換する
    エラーを throw する
    カスタムエラーの Catch と処理
    キー値の監視
    ターゲット・アクション
    シングルトン
    Introspection(内省)
  • 連載
  • ローカライズ
    自動解放プール
    API の利用
    コマンドライン引数の処理
  • C の API との相互作用
  • 原始的な型
  • グローバル定数
  • import された定数の列挙体と構造体
  • 関数
  • 可変個引数の関数
  • 構造体
  • 型メンバとして関数を import
    列挙型
    Option のセット
    ユニオン
    ビットフィールド
    名前のない構造体と union のフィールド
  • ポインタ
  • 定数ポインタ
    可変ポインタ
    自動解放ポインタ
    関数ポインタ
    バッファポインタ
    ヌルポインタ
    ポインタの計算
    データ型サイズの計算
    1回限りの初期化
  • プリプロセッサの指令
  • 簡単なマクロ
    複雑なマクロ
    条件付きコンパイルブロック
  • うまく組み合わせる(part III)
  • 同じプロジェクトでの Swift と Objective-C
  • 「うまく組み合わせる」概観
  • 同じアプリターゲット内からコードを import
  • Objective-C から Swift への import
    Swift から Objective-C への import
  • 同じフレームワークターゲット内からコードを import
  • Objective-C から Swift への import
    Swift から Objective-C への import
    外部フレームワークの import
  • Objective-C からの Swift の使い方
  • Objective-C ヘッダでの Swift クラスまたはプロトコルの参照
    Objective-C クラスで採用可能な Swift プロトコルを宣言
    Objective-C の実装での Swift プロトコルの採用
    Objective-C から使用できる Swift のエラー型の宣言
  • Objective-C インターフェイス用に Swift 名をオーバーライド
  • クラスファクトリメソッド
    列挙型
    Objective-C 宣言を洗練する
    Swift で Objective-C インターフェイスを使用できないようにする
    Objective-C API へ利用可能性情報の追加
    プロダクトモジュールの命名
    トラブルシューティングのヒントと注意
  • 移行(Part IV)
  • Objective-C から Swift への移行
  • 移行のための Objective-C コードの準備
  • 移行プロセス
  • はじめる前に
    作業中に
    見終わったら
    トラブルシューティングのヒントと注意
  • 更新履歴
  • マニュアルの更新履歴












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)












    トップへ(Swift を Cocoa と Objective-C と使う)