web-dev-qa-db-ja.com

swiftで同等の@ property / @ synthesize

次のように、クラス間でデータを渡すためにpropertyを宣言していました。

.h file (interface file)
@property (nonatomic) double topSpeed;

.m file (implementation file)
@synthesize topSpeed;

interfaceクラスはありません。.Swiftクラス間でデータを渡す方法は?

38
Mutawe

Swiftは、プロパティとインスタンス変数(つまり、プロパティの基になるストア)を区別しません。プロパティを定義するには、クラスのコンテキストで変数を宣言するだけです。

Swiftクラスは単なるClassName.Swiftファイルです。

クラスとプロパティを次のように宣言します

class SomeClass {

  var topSpeed: Double
  var aStrProperty: String
  var anIntProperty: Int

  //Initializers and other functions

}

プロパティ値にはドット表記を使用してアクセスします。 Xcode6ベータ4以降、Swiftにはアクセス修飾子(publicinternalおよびprivate)もあります。デフォルトでは、すべてのプロパティはinternalです。 詳細はこちら .

詳細については、 Swift Programming Guide を参照してください。

格納されたプロパティとインスタンス変数

Objective-Cの経験がある場合、クラスインスタンスの一部として値と参照を保存する2つの方法を提供していることがわかります。プロパティに加えて、プロパティに格納されている値のバッキングストアとしてインスタンス変数を使用できます。

Swiftはこれらの概念を単一のプロパティ宣言に統合します。 Swiftプロパティは対応するインスタンス変数を持たず、プロパティのバッキングストアは直接アクセスされません。このアプローチは、異なるコンテキストで値にアクセスする方法に関する混乱を回避し、プロパティの宣言を簡素化しますプロパティに関するすべての情報(名前、タイプ、メモリ管理特性など)は、タイプの定義の一部として単一の場所で定義されます。

54
Cezar

プロパティの使用。

Swift Programming Guide から:

保存されたプロパティとインスタンス変数

Objective-Cの経験がある場合、値と参照をクラスインスタンスの一部として保存する2つの方法を提供していることをご存知かもしれません。プロパティに加えて、プロパティに格納されている値のバッキングストアとしてインスタンス変数を使用できます。

Swiftはこれらの概念を単一のプロパティ宣言に統合します。 Swiftプロパティは対応するインスタンス変数を持たず、プロパティのバッキングストアは直接アクセスされません。このアプローチは、異なるコンテキストで値にアクセスする方法に関する混乱を回避し、プロパティの宣言を簡素化しますプロパティに関するすべての情報(名前、タイプ、メモリ管理特性など)は、タイプの定義の一部として単一の場所で定義されます。

13
trojanfoe

Objective-Cのプロパティは、Swiftのプロパティに対応しています。 Objective-CおよびSwiftにプロパティを実装するには、2つの方法があります。

  1. Objective Cで合成/自動合成されたプロパティ-これらはSwiftでは「保存されたプロパティ」と呼ばれます。関数本体でローカル変数を宣言するのとまったく同じように、クラス宣言でvar topSpeed : Doubleまたはlet topSpeed : Double = 4.2を使用して宣言するだけです。現在、Swiftにはインスタンス変数がないため、バッキングインスタンス変数の名前を指定することはできません。バッキングインスタンス変数の代わりに、常にプロパティを使用する必要があります。
  2. Objective-Cで手動で実装されたプロパティ-これらは、Swiftでは「計算されたプロパティ」と呼ばれます。 var topSpeed : Double { get { getter code here } set { setter code here } }readwriteプロパティの場合)、またはvar topSpeed : Double { getter code here }readonlyプロパティの場合)などのクラス宣言で宣言します。
3
newacct

質問の少なくとも一部は、特定のクラスのインターフェイスを他のクラスに伝えることに関するもののようです。 Like Java(およびC、C++、Objective-Cとは異なります)、Swiftはインターフェイスを実装から分離しません。importどこか別の場所で定義されたシンボルを使用する場合のヘッダーファイル代わりに、次のようにimport amodule

import Foundation
import MyClass

別のクラスのプロパティにアクセスするには、そのクラスをインポートします。

1
Caleb

格納されたプロパティとインスタンス変数

Objective-Cの経験がある場合、値と参照をクラスインスタンスの一部として保存する2つの方法を提供していることをご存知かもしれません。プロパティに加えて、プロパティに格納されている値のバッキングストアとしてインスタンス変数を使用できます。

Swiftはこれらの概念を単一のプロパティ宣言に統合します。 Swiftプロパティは対応するインスタンス変数を持たず、プロパティのバッキングストアは直接アクセスされません。このアプローチは、異なるコンテキストで値にアクセスする方法に関する混乱を回避し、プロパティの宣言を簡素化しますプロパティに関するすべての情報(名前、タイプ、メモリ管理特性など)は、タイプの定義の一部として単一の場所で定義されます。

Swift Programming Book:

    struct FixedLengthRange {
    var firstValue: Int
    let length: Int
    }

    var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
0
Erick Gonzales

私は言う:typealiasは、Swift for @synthesize

このリンクをご覧ください: https://docs.Swift.org/Swift-book/ReferenceManual/Declarations.html

enter image description here

0
AMH