0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Swift 10 SwiftのObject Programming Basic

Posted at

SwiftObjectアフリ開発を幅広く対応します。

十・壱 Objectは何ですか

Object≒ Class ≒ Instance はソフトウェアのアフリを構築するブロックにで
簡単に使えて再利用できる独立なIndependent Functional Modulesです。
TaskRunするためのObjectInstanceでアクセスしてCallされる
PropertyMethodObjectが構成されます。
Objectを構成するデータ var  func  を包括的に`Class Member`と言います。

十・弐 Classは何ですか

method : a particular form of procedure for accomplishing or approaching something, especially a systematic or established one.
origin : from meta- (expressing development) + hodos ‘way’.

これはObjectが生成する時の形を定義します。
例え、Methodが何をすることになるのか、どんなPropertyが存在するかなどを定義します。

弐・甲 Class宣言する

property : a thing or things belonging to someone; possessions collectively.
origin : from Latin proprietas, from proprius ‘one's own, particular’

Instance: an example or single occurrence of something.
origin : The original sense was ‘urgency, urgent entreaty’, surviving in at the instance of . In the late hence the meaning ‘single occurrence’.

ClassInstance化する前に、まずObjectに対するbluePrintを定義する必要があります。
新しく作るClassが、どのParent Classから派生したかを指定されてClassで含めるPropertyMethodを定義します。

class 新しいclassの名前:親class {
//property
//instance Method 
//type method 
}

本地的に此れらは特定Taskを実行するClass固有のFunctionである
Classの名前を作る時のルールは各単語の最初の文字を大文字で宣言するです。
これに反して、Propertyの名前とfunc  の名前は lowerCamelCaseで作ります。

弐・乙 Instance Property追加する

Object Programmingの主な目的はデータカプセル化という概念です
Classに保存してaccessできるデータは、そのClass内で定義されたMethodだけを通していいという事です。
Class内のカプセル化されたデータをPropertyまたはInstance var だと言います。

十・参 Method

参・甲Instance MethodType Method

MethodClassの性格に合った特定Taskを実行する為に呼び出されるコードルーチンです。
MethodType MethodInstance Methodで二つの形があります。
Type Methodは Classレベルに動作(例え、Classの新しいInstance生成する)します。
反面、Instance MethodClassInstanceに対する作業(例え、二つのProperty var... に対する算術演算をして結果を Returnすることです。

Instance Methodは自身が属することになるClassの ( 中で)宣言されて、標準のSwift func宣言Syntaxを使って宣言されます。

Type Methodは Instance Methodと同じ方法で宣言されるけど、前で Classキーワードが付ける点が違います。

class BankAccount {
    var accountBalance: Float = 0
    var accountNumber: Int = 0
    
    func displayBalance()
    {
        print("Number \(accountNumber)")
        print("Current balance is \(accountBalance)")
    }   
}

このMethodInstance Methodので``Class`が前に付けられません。

BankAccount Classを設計する時このClassで最多金額を知るためにClass自身のType Methodを呼び出せるなら便利そうだ
これを通してアフリがClass Instanceを初めて、生成する過程を経なくても、
BankAccount Classを新いお客様の情報を保存するかどうかを別できるようにします。

class BankAccount {
    var accountBalance: Float = 0
    var accountNumber: Int = 0
    
    func displayBalance()
    {
        print("Number \(accountNumber)")
        print("Current balance is \(accountBalance)")
    }
    
    class func getMaxBalance() -> Float {
        return 100000.00
    }
}

参・乙 Class Instance宣言する

Classを持ってどんな作業をすればInstanceを生成必要があります。
Instanceに対したReferenceを保存する var  を宣言する事です。

var account1: BankAccount = BankAccount()

account1と言う var ...をとしてBankAccount Classにアクセスができます。

参・丙 InitialするとDeinitialする

Class Instanceを生成するときでinitial必要なTaskがやるべきことがあるかもしれないです。
このTaskClassinit Method中で実装されます。
新しいClassInstanceが生成されるときvalueinitします。


class BankAccount {
    var accountBalance: Float = 0
    var accountNumber: Int = 0
    
    init(number: Int, balance: Float){
        accountNumber = number
        accountBalance = balance
    }
    
    func displayBalance()
    {
        print("Number \(accountNumber)")
        print("Current balance is \(accountBalance)")
    }
}

これで、ClassInstanceを生成する時に次の様に口座番号とbalanceで
initができます。

var account1 = BankAccount(number: 123213123, balance: 400.41)

逆に、Swift RuntimeSystemによってClass Instanceが消える前にするTaskClass中のDeinitを実装すればできます。


class BankAccount {
    var accountBalance: Float = 0
    var accountNumber: Int = 0
    
    init(number: Int, balance: Float){
        accountNumber = number
        accountBalance = balance
    }
    deinit{
 // 必要な`Task`をここで実行します。
}

    func displayBalance()
    {
        print("Number \(accountNumber)")
        print("Current balance is \(accountBalance)")
    }
}

参・丁 Method CallPropertyアクセス

ClassであるInstance Methodをどのように呼び出すか、Propertyにはどのようにアクセスするかを学びます。此れはdot notationを使えれば簡単にできます。

ClassInstance.propertyName
ClassInstance.instanceMethod()

例え、accountBalace Instance  var ...の現在のvalueを受け取れば

var balance1 = account1.accountBalance

点表記法を使うとInstance Propertyvalueを設定可能です。

account1.accountBalance = 6789.98

Class InstanceMethodを呼び出す時にも、同じ方法を使います。

account1.displayBalance() 

Type Methodも点表記法を使って呼び出します。注意することはClass Instanceがなく、Classで呼び出されるべきです。

ClassName.TypeMethod()

例え、前で宣言した、Type Method getMaxBalanceを呼び出すると、BankAccountがReferenceされます。

var maxAllowed = BankAccount.getMaxBalance()

十・肆 Property

肆・甲 Stored Property と Computed Property

Stored Property

は let   var   で含まれるvalueです。

class BankAccount {
    var accountBalance: Float = 0
    var accountNumber: Int = 0

Computed Property

Propertyvalueを設定すると、持ってくる時点で、どんな計算やロジクで処理されるvalueです。
此れは getterを生成して、選択的にsetter Methodを生成して、演算を実行するコードが含まれます。

class BankAccount {
    var accountBalance: Float = 0
    var accountNumber: Int = 0
    let fees: Float = 25.00
    
    var balanceLessFees: Float{
        get{
            return accountBalance - fees
        }
    }
.
.
.

上のコードには現在の残高からfeesを済むComputed PropertyReturnするgetterを追加しました。
選択肢のsetterもやはり同じ方法で宣言できます。

    var accountBalance: Float = 0
    var accountNumber: Int = 0
    let fees: Float = 25.00
    
    var balanceLessFees: Float{
        get{
            return accountBalance - fees
        }
        set(newBalance){
            accountBalance = newBalance - fees
        }
    }

肆・乙 遅延保存Property

Propertyを一番基本的なinitする方法は直接に割り当う事です。

var myProperty = 10

Propertyをvalueを割り当う

他の方法ではinitする作業でPropertyvalueを割り当てる事です。

class BankAccount {
    let title: String
    
    init(title: String){
        self.title = title
    }
}

PropertyをClosureを割り当う

もう少し複雑な方法ではClosureを使ってPropertyinitする事です。

class MyClass {
    
    var myProperty: String = {
        var result = resourceIntensiveTask()
        result = processData(data: result)
        return result
    }()
}

複雑なClosureの場合はinit作業がリソースと時間を多く使われることになります。Closureを使って宣言すると、該当Propertyがコード内で実際使われるのかは関係なく、ClassInstanceが生成される度にinit作業が実施される。

Lazy Property

例え、データベースからデータを持ってくる持って来たり使用者からinputを入手する時、実行フロセスの後半部までPropertyvalueが割り当てられたかと、わからない状況が起こる可能性があります。
こんな状況で最も効果的な方法は、Propertyを最初に接近する時のみinit作業をすることです。此れは lazy Propertyで宣言します。

class MyClass {
    lazy var myProperty: String = {
        var result = resourceIntensiveTask()
        result = processData(data: result)
        return result
    }()
}

Propertylazyで宣言すると、最初に接近される時のみinitされます。
ですから、リソース集約的な活動を後回しにすることができます。
lazy Propertyは必ずvar   で宣言される。

十・伍 Self

Objectフログラミーぐ言語で慣れたフログラマーなら、現在のClass Instanceで属するMethodPropertyを指すとき、PropertyMethod前でselfを付けす習慣があるはず。Swiftフログラミーぐもやはりself Propertyターフを提供します。

class MyClass{
var myNumber = 1 
func addTen(){
    self.myNumber +=10
    }
}

前のコードでselfはMyClassClass Instanceに属するmyNumberと言うPropertyreferenceすることをCompilerに知らせます。
だが、耐部分の場合Swiftでフログラミーぐする時にはselfを使う必要がありません。selfPropertyMethodに対したReferenceをでデフォルトで見なすからです。そして

func addTen(){
    myNumber += 10
}

耐部分の場合はSwiftでselfは選択的に使用されます。selfを使用する必要がある場合はPropertyMethodClosure表現式内でreferenceするときです。

document?.openWithCompletionHandler({(success: bool) -> Void in
    if success{
        self.ubiquityURL = resultURL
    }
})

また、 func(){ }(Para,meter) Class Propertyと同じ名前を持つ場合にコードの曖昧さを解決為に、self.を使う必要があります。

十・陸 Protocol

他のClass{}と一緒に作業する為に最初のルールを: Protocolと言います。
此れは必ず含めるべきのMethod()Property = 0を正義します。
あるClass{}: Protocolを採用したが、全てのプロトコルの要件を満たさない場合エラーが発生します。

protocol MessageBuilder{
    
    var name: String { get }
    func buildMessage() -> String
}

class MyClass: MessageBuilder {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    func buildMessage() -> String {
        "Hello" + name
    }
}

十・柒 不透明return ___ターフ

不透明return ___は指定された: Protocolが全てのタープをリターンされる様にします。
これは: Protocolの前で someキーワードを付けて宣言されます。例え次のコードはdoubleFunc1() func(){ }がEquatable : Protocolを従う全てのTypeの結果がリターンされたと宣言する。

func doubleFunc1 (value: Int)-> some Equatable {
    value * 2 //returnが必要ない
}

元々Equatable : Protocolを従う為には、
valueたちが互いに同じかどうか比較できる必要がありますが、
some (return) ___は全ての : Protocolで使用できます。
IntとStringタイプ全てがEquatable : Protocolを従えば、String 結果を ↑ returnするfunc(){ }も生成できます。

func doubleFunc2(value: Stinrg) -> some Equatable {
    value + value
}

ライブラリやAPIフレームワーク内においてソースコードを見ることができなければ
正確にどんなType↑ returnされるか知らないだろう。

要約

Swiftと同じObjectProgramming言語はコード再利用とClass Instance(){}内のデータカプシュル化されたClass{}は生成を奨励します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?