# swift2.0データ構造:メタグループ、列挙、構造体


概念の紹介
名前
説明
メタグループ
メタグループはswiftに特有のデータ構造で、任意のタイプの値を格納することができ、軽量な構造で使用するのに非常に便利で軽量です.
列挙
swiftの列挙値はhashテーブルによって格納、明確に指定されていない場合.暗黙的に一連のInt値に変換されることもありません
こうぞうたい
異なるデータ型を統合して新しい構造を構築するのが構造体である.
メタグループ
swift    ,                     ,       ,           ,                      .

きほんしよう
 //      
 let ice = ("a",1,"b")
//  
let a = ice.0  //        0  
print(a)
let (c,d,e) = ice //         
print(c + "|" + String(d) + "|" + e)
//                 '_'        
let (name,age,_) = ice
print(age)
                        
let man = (name:"wang",age:18)
print(man.name) //                            ?

個人的な理解
メタグループは私から見れば簡単な構造体であり、いつでもいつでも構造を作成し、作成時に値を付与し、空の値は現れない.メタグループをモデルとして用いるデータをより安全に保存し、スペースを節約する.
列挙
                      .             ,            .swift         , swift ,             ,               .  ,             ,       Int

基本的な使い方

//        
enum ServerStart {
    case Connection 
    case Break
}
//  
let saveStart = ServerStart.Break //        ,  Break
print(saveStart) //          :Break    C         
//        
switch saveStart {
    case .Break:
        print("The is break")
    case .Connection:
        print("The is connection")
    default: break
}
    :
//The is break
 C                          ,   swift       ,         ,         0     
    enum Friender:Int { //  ,          Int    ,       Int   
    case kid = 12
    case adult = 30
}
 //         rawValue        
let a = Friender.adult
print(a.hashValue) //  hash            , 0  
print(a.rawValue)   //  raw ,            
               , swift              .
//  
enum names {
    case English(Number:Int,Name:String) //               ,       
    case Chinese(String)    //                         
}
//  

let a = names.Chinese("asd")
//       switch             ,           ,          QQ:326354777
switch a {
    case .Chinese(let name):
        print(name)
    case .English(let number, let name):
        print(name)
}

その他の機能
値を格納ことができるほか、方法を用いることもできる.(このTMはクラスになるわけではない)、列挙構造体だけでなく独自の方法もあり、Intなどの基本タイプを見れば明らかである.Swiftでは基本的なタイプは構造体によって記憶されており、それぞれ異なる方法をカプセル化している.例えばInt値のtoIntMax()メソッド
//  
enum People {
    case white
    case balck
    func description() -> String {
        return String(self) //self      
    }
}
//  
let man = People.white
print(man.description())

メソッド内で列挙自体の値を変更する必要がある場合、メソッドを定数呼び出しできないタイプに宣言する必要がある場合は、キーワードmutatingを使用します.
enum People {
    case white
    case balck
    func description() -> String {//         
        return String(self)
    }
    mutating func aa(){ //    var                 
        self = .balck
    }
}

こうぞうたい
swiftでは、構造体とクラスの区別が難しく、属性、方法、さらには使用方法が近いので、次は区別テーブルです.
クラスと構造体の違い
機能
Class
Struct
継承
はい
いいえ
プロトコル
はい
はい
拡張
はい
はい
属性が空であるかどうか
はい
いいえ
クラスメソッド
はい(class)
はい(static)
静的プロパティ
需要単利モード
はい
こうぞうかんすう
はい
いいえ
コンストラクタ
はい
はい
通知
はい
いいえ
エージェント
はい
いいえ
メモリの解放
はい
いいえ
構造体の貯蔵特性
構造体はswiftにおいて1つの値として存在する、すなわち、1つの構造体の値を別の構造体変数に付与すると、2つの同じ値が異なる変数に存在し、そのうちの1つの変数の値を変更しても他の値に影響しない.これはクラスとは異なり、クラスオブジェクトを使用する場合、オブジェクトを別のオブジェクトに割り当てると、そのオブジェクトは2つにはならず、そのうちの1つのオブジェクトが別のオブジェクトを変更するも変化する.だから構造体は通知やエージェントを使用できない.
構造体はいつ使いますか.
         ,           ?          ,            ,             ,                 ?
  • [X]構造体は通知やエージェントを使用することができないので,境界を越えて参照したい場合は構造体を放棄しよう.
  • [X]構造体は継承をサポートすることができないため、拡張性が劣り、属性が後で拡張する可能性がある場合でも構造体
  • を使用することはできない.
  • [X]構造体付与値は参照ではなくコピー操作に属するため、共通属性が必要な場合は
  • は使用できない.
  • [√]いくつかの基本タイプを組み合わせる必要がある場合、クラスよりも軽くて便利な構造体を使用することができます.
  • [√]よりよく理解できる名称を用いて基本タイプを定義し、基本データに方法と初期化機能を追加する.

  • 基本的な使い方
    //       
    struct JXPeople{
        var name:String = "12"  //                
        var age:Int //         ,                 ,      '?'       
        var height:Float
    
        func aaaaa()  { //    ,      
            print("    ")
        }
        static func bbbbb(){ //         static,        .
            print("    ")
        }
    }
    //      
    //     ,            ,               
    let man:JXPeople = JXPeople.init(name: "sd", age: 5, height: 12.0 )
    print(man.name)//  name
    man.aaaaa()//      
    JXPeople.bbbbb()//      
        :
    sd
        
        

    拡張と書き換え
    また,構造体拡張法と書き換え初期化法も可能である.
    
    struct JXPeople{
        var name:String = "12"
        var age:Int
        var height:Float
    
        init(){//       ,                       
            self.name = "asd"
            self.height = 12.0
            self.age = 1
        }
    }
    //    
    extension JXPeople{ //           
        init(_age:Int,_height:Float){ //            
            self.age = _age
            self.height = _height
        }
        mutating func setName(_name:String){
        //mutating       var          ,             mutating
            self.name = _name
        }
    }
    

    注意:OCではUIViewのFrame属性に直接XまたはYを設定ことができず、深度付与エラーと呼ぶ.しかし、Swiftではこのエラーはありません.XまたはYを直接設定できます