Swift
はObject
アフリ開発を幅広く対応します。
十・壱 Object
は何ですか
Object
≒ Class ≒ Instance はソフトウェアのアフリを構築するブロックにで
簡単に使えて再利用できる独立なIndependent Functional Modules
です。
Task
をRun
するためのObject
とInstance
でアクセスしてCall
される
Property
とMethod
でObject
が構成されます。
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’.
Class
をInstance
化する前に、まずObject
に対するbluePrint
を定義する必要があります。
新しく作るClass
が、どのParent Class
から派生したかを指定されてClass
で含めるProperty
とMethod
を定義します。
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 Method
とType Method
Method
はClass
の性格に合った特定Task
を実行する為に呼び出されるコードルーチンです。
Method
はType Method
とInstance Method
で二つの形があります。
Type Method
は Class
レベルに動作(例え、Class
の新しいInstance
生成する)します。
反面、Instance Method
はClass
のInstance
に対する作業(例え、二つの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)")
}
}
このMethod
はInstance 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
がやるべきことがあるかもしれないです。
このTask
はClass
のinit Method
中で実装されます。
新しいClass
のInstance
が生成されるときvalue
をinit
します。
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)")
}
}
これで、Class
のInstance
を生成する時に次の様に口座番号とbalanceで
init
ができます。
var account1 = BankAccount(number: 123213123, balance: 400.41)
逆に、Swift RuntimeSystemによってClass
Instance
が消える前にするTask
はClass
中の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
Call
とProperty
アクセス
Class
であるInstance
Method
をどのように呼び出すか、Property
にはどのようにアクセスするかを学びます。此れはdot notation
を使えれば簡単にできます。
ClassInstance.propertyName
ClassInstance.instanceMethod()
例え、accountBalace Instance
var ...
の現在のvalue
を受け取れば
var balance1 = account1.accountBalance
点表記法を使うとInstance
Property
でvalue
を設定可能です。
account1.accountBalance = 6789.98
Class
Instance
のMethod
を呼び出す時にも、同じ方法を使います。
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
Property
でvalue
を設定すると、持ってくる時点で、どんな計算やロジクで処理される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 Property
を Return
する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
する作業でProperty
でvalue
を割り当てる事です。
class BankAccount {
let title: String
init(title: String){
self.title = title
}
}
PropertyをClosure
を割り当う
もう少し複雑な方法ではClosure
を使ってProperty
をinit
する事です。
class MyClass {
var myProperty: String = {
var result = resourceIntensiveTask()
result = processData(data: result)
return result
}()
}
複雑なClosure
の場合はinit
作業がリソースと時間を多く使われることになります。Closure
を使って宣言すると、該当Property
がコード内で実際使われるのかは関係なく、Class
のInstance
が生成される度にinit
作業が実施される。
Lazy Property
例え、データベースからデータを持ってくる持って来たり使用者からinput
を入手する時、実行フロセスの後半部までProperty
でvalue
が割り当てられたかと、わからない状況が起こる可能性があります。
こんな状況で最も効果的な方法は、Property
を最初に接近する時のみinit
作業をすることです。此れは lazy Property
で宣言します。
class MyClass {
lazy var myProperty: String = {
var result = resourceIntensiveTask()
result = processData(data: result)
return result
}()
}
Property
をlazy
で宣言すると、最初に接近される時のみinit
されます。
ですから、リソース集約的な活動を後回しにすることができます。
lazy
Property
は必ずvar
で宣言される。
十・伍 Self
Object
フログラミーぐ言語で慣れたフログラマーなら、現在のClass
Instance
で属するMethod
やProperty
を指すとき、Property
とMethod
前でself
を付けす習慣があるはず。Swift
フログラミーぐもやはりself
Property
ターフを提供します。
class MyClass{
var myNumber = 1
func addTen(){
self.myNumber +=10
}
}
前のコードでself
はMyClassClass Instance
に属するmyNumberと言うProperty
をreference
することをCompilerに知らせます。
だが、耐部分の場合Swiftでフログラミーぐする時にはself
を使う必要がありません。self
はProperty
とMethod
に対したReference
をでデフォルトで見なすからです。そして
func addTen(){
myNumber += 10
}
耐部分の場合はSwiftでself
は選択的に使用されます。selfを使用する必要がある場合はProperty
なMethod
をClosure
表現式内で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{}
は生成を奨励します。