体系的なstructureと効果的なcodeを作成することが核心部分で、굿
Codeの反服を避けながらprogramをstructingする方法を提供します。
九・壱 functionは何ですか
壱・甲
parameter:
a numerical or other measurable factor (system , statistic)
Origin ~ modern Latin, from Greek para-‘beside’ + metron ‘measure’.
argument :
1 - an exchange of diverging or opposite views
2 - aim of persuading others
Origin ~ Latin argumentum, from argueremake clear, prove, accuse
parameter
とargument
はprogram codeがどこでも算術計算が必要すれば、パラメータの値を Argument
にこの関数で伝達して呼べば、結果値が変換されるのである。
壱・乙Methodは何だ
Swiftでは
Class内で
func宣言たったら、これを
Method`で考えられます。
九・弐 Swiftでfunc
宣言する方法
弐・甲
func<funcName> (<parameterName>: <parameterType>,
<parameterName>: <parameterType>) -> <returnResultType> {
//func Codes...
}
- funcName: アフリのコード内で、
Function
をcall
する時、Reference
される名前 - returnResultType:
func
がReturn
する結果のデータターフ。もしfunc
がデータをReturn
しなればreturnResultType
を指定ない。
弐・乙 単一表現式での暗黙的Return
もし、func
が単一表現式を持っているなら、Return
Syntax
を略する事ができます。
func buildMessageFor(name: String, count: Int) -> String {
+"\(name), your are customer number \(count)" //no return
}
func
がもし二つの表現式を持っている場合には、Return
が必要です。
func buildMessageFor(name: String, count: Int) -> String {
- let uppername = name.uppercased()
- "\(name), your are customer number \(count)" //Compile Error!!
}
弐・丙 Swift call
<funcName>(<argument1><argument2>)
func
をとして伝達されるそれぞれのArgument
はfunc
がもらうように構成されたParameter
と一致するべきです。
何のValue
をReturn
しないsayHelloという名前のfunc
を call
しれぱ...
sayHello()
九・参 return
参・甲 return
Value
処理する
逆に、二つのParameter
貰って結果をReturn
するBuildMessengeForという名前のfunc
を call
する為には、次の様なコードを作成することになる
let message = buildMessageFor(name: "John", count: 100)
前の例題にはreturn
される結果を保存する為に「=」を使えました。
でも、func
を call
してreturn
されたvalue
を使わない場合が起ければ
return
value
を「 _ 」で 割り当てそのvalue
を捨てる。
_ = buildMessageFor(name: "John", count: 100)
九・肆 Parameter
## 肆・甲 Local Parameter
とExternal Parameter
以前の例題のfunc
たちは宣言する時にfunc
コード内でreference
できる名前を構成しました。このように宣言された Parameter
を Local Parameter
と言います。
基本的に、func
の Parameter
には、 Local Parameter
と External Parameter
が割り当います。
Parameter
で割り当たExternal Parameter
は Local Parameter
の前で
「 _ 」を使って消える事ができます。
func buildMessageFor(_ name: String, _ count: Int) -> String{
return "\(name), your are customer number \(count)"
他の方法で、func
宣言部で Local Parameter
の前で External Parameter
を宣言すれば簡単にExternal Parameter
が追加されます。
func buildMessageFor(userName name: String, userCount count: Int) -> String{
return "\(name), your are customer number \(count)"
その場合にはfunc
を call
する時に必ず External Parameter
をreference
するべきです。
let message = buildMessageFor(username: "John", usercount:100)
func
を call
する時にはArgument
を伝達ために External Parameter
が使われてもfunc
の内は Parameter
をreference
する時には相変わらず Local Parameter
の名前がを使われます。
肆・乙 func
でDefault Parameter
宣言する
スイフトはfunc
が call
される時、Argument
で使うValue
が戻らない場合で使うDefault Parameter
のValue
を割り当う事ができます。
func buildMessageFor(_ name: String = "Customer", count: Int) -> String {
return "\(name), your are customer number \(count)"
}
そのfunc
は _ name Argument
を伝達しなくても call
される事ができます。
let message = buildMessageFor(count: 100) // _ name XX But OK
print(message)
肆・丙 多くのValue
Return
する
value
をTuple
でWrapping
すると多くなvalue
をfunc
が Return
ができます。
func sizeCovnerter(_ length: Float) ->(yards: Float, centimeters: Float, meters: Float) {
let yards - length * 0.02777778
let centimeters = length * 2.54
let meters = length * 0.0254
return(yards, centimeters, meters)
肆・丁 Variadic Parameter
variadic : Taking a variable number of arguments
commonly used in programming languages like C and C++ through features like the ellipsis (...)
なぜ使う
アフリのコード内でfunc
が call
される時に受け取る Parameter
が何個のか知らない場合もあります。スイフトはVariadic Parameter
を使ってこのような場合を処理できるようにします。
意味
func
が指定されたデータターフの Parameter
数が 0...?受け取ることを意味します。
使い方
.三つ ...で表見します。
Parameter
はArray Object
の形で使うことかできます。
func displayStrings(_ strings: String...)
{
for string in strings {
print(string)
}
}
displayStrings("one", "two", "three", "four")
肆・戊 変数の Parameter
func
が受ける全ての Parameter
は基本に常数として扱われます。
Parameter
のvalue
を変更したいなら、Shadow Copy
を必ず作成する必要があります。
func calcuateArea(length: Float, width: Float) -> Float {
var length = length
var width = width
length = length * 2.54
width = width * 2.54
return length * width
}
print(calcuateArea(length: 10, width: 20))
肆・己 func
内の計算はExternal Parameter
に営業ない
でも、func
がValue
をreturn
した後でも Parameter
に対した変更を維持すれば、func
のname() -> ...
内でin out parameter
で 宣言すべきだ。
これを確認ために
肆・庚 データターフ様に取扱可能なfunc
元々のfunc
の名前ではなく、let =
を使えて
func inchesToFeet (_ inches: Float) -> Float {
return inches * 0.0833333
}
let toFeet = inchesToFeet
元々のfunc <name>
ではなく、let <name>
を使って func
を call
することができます。
let result = toFeet(10)
// 0.8333333333
此れは let =
とvar
で、割り当てられたfunc
は色んなターフの機能「他のfunc
のargument
で送られると、returnValue
でも Return
されることもあります。
肆・辛 func
のDataType
受け取る Parameter
のDataType
とReturn
されるDataType
を組み合わせて決定されます。
float
を Parameter
で受け取ってfloat
を結果でReturn
するせいで float
になります。
(Float) -> Float
反面、Int
とDouble
を Parameter
で受け取ってString
結果をReturn
するfunc
は string
になります。
(Int, Double) -> String
どのfunc
が他のfunc
を Parameter
で受け取る為には
Parameter
で受け取るfunc
のDataType
を宣言すればいい
func inchesToFeet (_ inches: Float) -> Float {
return inches * 0.0833333
}
func inchesToYards (_ inches: Float) -> Float {
return inches * 0.0277778
}
let toFeet = inchesToFeet
let toYards = inchesToYards
このfunc
たちを活用ためのあたらしいfunc
func outputConversion(_ converterFunc: (Float) -> Float, value: Float) {
let result = converterFunc(value)
print("Result of conversion is \(result)")
outputConversion(toYards, value:10)
outputConversion(toFeet, value:10)
このfunc
は前のfunc
が (Float) -> Float の場合にだけで行います。
このfunc
を使う目的は、
あらかじめ宣言したDataType
と一致するfunc
が 伝達しなければなりません。
九・伍 Closure
表現式
closure : (psychological) ability to come to terms with a traumatic or distressing event and find a sense of resolution and peace.
closure : (mathematic) refers to a property of an operation within a set. An operation is said to have closure if when you perform that operation on elements within the set, the result is also an element of that set. For example, addition has closure in the set of real numbers, because when you add two real numbers, the result is still a real number.
伍・甲 closureExpression
について
closureExpression
は
let seyHello = { print("Hellow")}
sayHellow()
独立なコードブロックです。
closureExpression
宣言してそれを sayHello というlet =
で割り当て
func
を call
する
closureExpression
は Parameter
を受け取てvalue
をReturn
する様に構成することもできます。
す八艇は
let multiply = {(_ val1:Int, _ val2: Int) -> Int in
return val1 * val2
}
let result = multiply(10,20)
ClosureExpression
は名前を持たず、
Parameter
と ReturnType
は( )中で含まれて、ClosureExpressionCode
の初めを指すためinKewWord
を使えます。func
は名前があるClosure 表現式に過ぎないんです。
Swift 5.5でStructured Concurrency
を導入前に、ClosureExpression
AsyncMethodCall
に対したcompletionHandler
を宣言するときにたまに使えます。
つまり、IOSアフリを開発するとき、あるTask
をバックグラウンドでTask
させることで
アフリが他のTask
を続けられる様にOperatingSystem
でりクエストしなければならない場合がどきどきあります。
その場合にはシステムがアフリにTask
が完了されることを知らせて、Method
を Call
する時宣言されたcompletionHandler
を Call
して結果を Return
します。
completionHandler
のコードは主にClosureExpression
形で貢献実装されます。
伍・乙 shorthand argument name
「略式引受名前」
此れはname() -> ...
で Parameter
の名前をとin Keword
を省略される様にしますArgument
を\$0,\$1,\$2などとReference
できます。
伍・丙 Swift
のClosure
コンピュータ工学用語でのClosure
は、func
やClosureExpression
などの独立したコードブロックと、コードブロックの周りにある一つ以上のvar
を組み合わせたものを指します。
func A
は、func B
という名前のfunc
をReturn
します。
func B
は内部エリア外の var counter
に依存しています。
func A
はClosure
を Return
しています。
言い直して、func B
はcounter var
を持っています。または、閉じ込めているだと言えるので、伝統的なコンピュータ工学用語Closure
でなされます。
要約
func
、Closure
そしてClosureExpression
は独立したコードブロックで、特定Task
をRunning
するためCall
される事が慣れる事ができるあり、
コードをStruct
されて再使用するメカニズムを提供します。