Swfit入門チュートリアル9-クラスと構造体


オリジナルblog、転載は出典を明記してください
http://blog.csdn.net/hello_hwc
この2つを一緒に置くのは,swfitではクラスと構造体の関係が非常に緊密であり,クラスで実現するか構造体で実現するかを区別することが難しい場合が多いからである.他の言語では、クラスはオブジェクトに対応するが、swfitでは、クラス対応インスタンスと呼ばれることが多く、構造体もインスタンスに対応する.
一、類と構造体の異同
1、属性記憶値を定義することができる
2、いずれも方法提供機能を定義できる
3、すべて構造関数を定義することができる
4、付属スクリプトの定義が可能
5、すべて拡張と協議をサポートする
クラスは、構造体に対して以下の機能を有する
1、クラスは継承を許可する2、クラスは動的タイプチェックを許可する3、クラスは解析器が資源を解放することを許可する
クラスパスは参照であり、構造体パスは値、すなわちcopyであることを常に覚えておいてください.
以下の場合、構造体を使用するのに適しています.
1、少量の関連データを保存して伝達し、参照ではなく値を伝達する.(ほとんどの場合、この点を考慮しています)
2、継承は不要
二、クラスと構造体の簡単な分析
定義#テイギ#
class HwcClass{
var classVariable = 0
func print(){
println("From class")
      }
}
struct HwcStruct{
  var structVariable = 1
func print(){
println("From struct")
}
}

ここでは、クラス名の先頭に大文字、属性と方法の先頭に小文字を書く命名習慣を身につけます.
次に、各単語の頭文字を大文字にします.たとえば、var firstVariable
クラスを宣言した後、コンストラクタでインスタンスを作成します.
var someHwcClassInstance = HwcClass()
var someHwcStructInstance = HwcStruct()
ポイント(.)でクラスまたは構造体の属性と方法を訪問する
var classVariable =  someHwcClassInstance.classVariable 
var structVariable =  someHwcStructInstance.structVariable 
someHwcClassInstance.print()
someHwcStructInstance.print()
ここでは、Objective-Cとは異なり、swfitは構造体のサブプロパティを直接変更し、array
とディクショナリ内部は構造体で実現されているので、AnyObjectには属していません
クラスと構造体が「等しい」かどうかを判断する
クラスでは参照タイプなので、等しいかどうかは2つの参照が同じかどうかによって決まります.
swiftは==と!==を提供します.ディスクは等価かどうか、つまり同じ引用かどうかを判断する.
構造体にとっては値タイプなので、等しいかどうかは2つの構造体の内容が等しいかどうかを見ます.
==と!を採用判断する
三、属性
swiftでobjecti-Cの属性定義を1つの文に簡略化
名前付きタイプメモリ管理フィーチャー
1、ストレージ属性-class structで使用可能
値を格納するために使用される定数、変数
定義時に初期値を指定したり、構築時に初期値を付与したりできます(letタイプのプロパティにも使用します)
class csdnID{
    var name:String = “jack”
    let ID:String = "123456"
    init(name:String,ID:String){
	self.name = name;
	self.ID = ID	
}
}
var myID = csdnID(name:"HelloHwc",ID:"12345568")
myID.name = "CallMeHwc"
//myID.ID = "1234556" wrong
ユーザー名は変更できるが、システムがユーザーに付与した識別IDは変更できないため、変更したくない場合は、生命の中でletと宣言すればよい.注意、タイムリーにletであり、構築時に付与することができる.
2、遅延属性
キーワードlazy
必要に応じて初期化を行い、構築時に初期化を行う必要はありませんが、遅延プロパティにコンストラクタを指定します.
次の場合に適用されます.
(1)属性の値が複雑または大量の計算を必要とする場合
(2)属性値が外部要因に依存する場合
(3)属性値が不確定である場合
class CSDN{
	lazy lazycoder:NSMutableArray = NSMutableArray(array:["jack","lucy","tom"])
	//Something else
}
このlazy変数を使用したい場合に直接使用します.私たちはその人たちのlazyを毎回知るわけではないので、構造するたびにこの変数を初期化する必要はありません.
var instance = CSDN()
var lazyCoders = instance.lazycoder

3、計算属性-class struct enumで使用できる
計算プロパティメモリに属性は保存されません
getterによる値の取得
間接付与のためのオプションsetter
class Line{
    let startPoint:Int = 0
    var endPoint:Int = 15
    var centerPoint:Int{
        get{
            return startPoint+endPoint/2
         }
         set(newCenter){
            endPoint = 2*newCenter - startPoint
         }
    }
}

swiftではsetterメソッドに対して、デフォルトのnewValueを入力値として使用できます.
class Line{
    let startPoint:Int = 0
    var endPoint:Int = 15
    var centerPoint:Int{
        get{
            return startPoint+endPoint/2
        }
        set{
            endPoint = 2*newValue - startPoint
           }
    }
}

var line1 = Line()
println(line1.endPoint)
println(line1.centerPoint)
line1.centerPoint = 10
println(line1.endPoint)

setメソッドが指定されていない場合、centerPointは読み取り専用プロパティです.
class Line{
    let startPoint:Int = 0
    var endPoint:Int = 15
    var centerPoint:Int{
    get{
        return startPoint+endPoint/2
    }
    }
}
var line1 = Line()
line1.centerPoint = 10//Wrong

4、属性オブザーバ
プロパティ・オブザーバは、値が変化しなくても値が付与されるたびに、プロパティ・オブザーバが呼び出されます.でも
初期化時も含めて.
2つのオブザーバがあり、
willSetはプロパティ設定前に呼び出されます.デフォルトでは新しい値が消去として入力され、指定しない場合はnewValueとしてデフォルト設定されます.
didSet  プロパティが設定された後に呼び出されます.デフォルトの古い値が入力され、指定されていない場合、デフォルトoldValue
class Test{
    var testVar:String = "oldvalue"{
    willSet{
        println("Value to be set is \(newValue)")
    }
    didSet{
        println("Old value is \(oldValue)")
    }
    }
}
var instance = Test()
instance.testVar = "newvalue"
出力は
Value to be set is newvalue
Old value is oldValue

5、タイプ属性-struct enumに適用
C++のstatic属性と同様に、この属性はクラスに属し、呼び出すときに直接タイプ名で呼び出され、インスタンス化する必要はありません.
structおよびenumの場合、タイププロパティはキーワードstaticによって宣言されます.
≪タイプ・プロパティの使用|Use Type Properties|emdw≫:オブジェクトに依存しないプロパティです.たとえば、次のタイプの説明はオブジェクトに依存しません.
struct Point{
    var x:Int = 0
    var y:Int = 0
    static var description:String = "This is a struct about Point"
}
println(Point.description)

四、方法
Swfitではクラス,構造体,列挙の定義方法とすることができ,これもobjective Cに対するswfitの変更の一つである.
方法は二つに分かれている
≪インスタンス・メソッド|Instance Method|oem_src≫:インスタンスによって呼び出されます.
タイプメソッド:クラス名でキーワードとタイププロパティを呼び出すのと同じようにstaticとclassで宣言します.
1、実例方法
呼び出すときは.で呼び出す
ここでselfはインスタンス自体であり、C++のthisポインタに似ています.
簡単な例
struct PersonInfo{
    var name:String;
    var id:String;
    func showInformation(){
        println("\(name)
\(id)") } } class MyCSDN{ var info:PersonInfo var visitTimes:Int init(info:PersonInfo,visitTimes:Int){ self.info = info // self self.visitTimes = visitTimes } func showCSDNInfo(){ info.showInformation() println(visitTimes) } } var onePerson = PersonInfo(name:"hwc",id:"7865123") var myCsdn = MyCSDN(info:onePerson,visitTimes:6800) myCsdn.showCSDNInfo()
出力が表示されます
hwc
7865123
6800
2、ローカルおよび外部パラメータ名
関数内で使用するローカルパラメータ
呼び出し時に使用する外部パラメータ
swiftのデフォルトでは、メソッドの2番目のパラメータに外部パラメータの提供が開始されます.1番目のパラメータも外部パラメータとして使用したい場合は、#を追加できます.
例を挙げる
class CSDN{
    func testWithFirst(first:Int,second:Int){
        println(first+second)
    }
}
var instance = CSDN()
instance.testWithFirst(1,second:2)
最初のパラメータが外部パラメータを提供しない場合、通常は関数名にwith,byなどで最初のパラメータが何であるかを示す
もちろん、外部パラメータとして使用する#を追加することもできます.この場合、名前は上記のように、最初のパラメータが何をしているかを示す必要はありません.
class CSDN{
    func testWith(#first:Int,second:Int){
        println(first+second)
    }
}
var instance = CSDN()
instance.testWithFirst(first:1,second:2)

3、mutatingキーワード
構造体および列挙では、値タイプであるため、インスタンスメソッドでは値の変更は一般的に許可されません.
本当に変更が必要な場合はmutatingというメソッドを選択し、メソッド呼び出し後に変更がインスタンスに保存されます.
struct Line{
    var startPoint:Int = 0
    var endPoint:Int = 15
    mutating func changeEndPoint(newValue:Int){
    endPoint = newValue
    }
}
var line = Line()
line.changeEndPoint(20)
println(line.endPoint)

4種類の方法
classのキーワードclassの使用
struct enumのキーワードstaticの使用 
例を挙げる
private var name:String = "Hello_hwc"
class CSDN{
    class func print(){
        println(name)
    }
}
CSDN.print()

ADD:swift言語バージョンの更新の問題で、classでのインスタンス変数の宣言は一時的にサポートされません.