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 09 function, method, closure

Posted at

体系的な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 arguere make clear, prove, accuse

parameterargumentはprogram codeがどこでも算術計算が必要すれば、パラメータの値を Argumentにこの関数で伝達して呼べば、結果値が変換されるのである。

壱・乙Methodは何だ

SwiftではClass内でfunc宣言たったら、これをMethod`で考えられます。

九・弐 Swiftでfunc宣言する方法

弐・甲

func<funcName> (<parameterName>: <parameterType>,
                <parameterName>: <parameterType>) -> <returnResultType> {
//func Codes...
}
  • funcName: アフリのコード内で、Functioncallする時、Referenceされる名前
  • returnResultType: funcReturnする結果のデータターフ。もし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をとして伝達されるそれぞれのArgumentfuncがもらうように構成されたParameterと一致するべきです。
何のValueReturnしないsayHelloという名前のfunccallしれぱ...

sayHello()

九・参 return

参・甲 return Value処理する

逆に、二つのParameter貰って結果をReturnするBuildMessengeForという名前のfunccallする為には、次の様なコードを作成することになる

let message = buildMessageFor(name: "John", count: 100)

前の例題にはreturnされる結果を保存する為に「=」を使えました。
でも、funccallしてreturnされたvalueを使わない場合が起ければ
return valueを「 _ 」で 割り当てそのvalueを捨てる。

_ = buildMessageFor(name: "John", count: 100)

九・肆 Parameter

## 肆・甲 Local ParameterとExternal Parameter
以前の例題のfuncたちは宣言する時にfuncコード内でreferenceできる名前を構成しました。このように宣言された ParameterLocal Parameterと言います。
基本的に、funcParameterには、 Local ParameterExternal Parameterが割り当います。
Parameterで割り当たExternal ParameterLocal 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)"

その場合にはfunccallする時に必ず External Parameterreferenceするべきです。

let message = buildMessageFor(username: "John", usercount:100)

funccallする時にはArgumentを伝達ために External Parameterが使われてもfuncの内は Parameterreferenceする時には相変わらず Local Parameterの名前がを使われます。

肆・乙 funcDefault Parameter宣言する

スイフトはfunccallされる時、Argumentで使うValueが戻らない場合で使うDefault ParameterValueを割り当う事ができます。

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する

valueTupleWrappingすると多くなvaluefuncReturnができます。

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 (...)

なぜ使う

アフリのコード内でfunccallされる時に受け取る Parameterが何個のか知らない場合もあります。スイフトはVariadic Parameterを使ってこのような場合を処理できるようにします。

意味

funcが指定されたデータターフの Parameter数が 0...?受け取ることを意味します。

使い方

.三つ ...で表見します。
ParameterArray Objectの形で使うことかできます。

func displayStrings(_ strings: String...)
{
 for string in strings {
         print(string)
    }
}
displayStrings("one", "two", "three", "four")

肆・戊 変数の Parameter

funcが受ける全ての Parameterは基本に常数として扱われます。
Parametervalueを変更したいなら、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に営業ない

Screenshot 2023-10-14 at 8.41.08 PM.png
Screenshot 2023-10-14 at 8.14.44 PM.png

でも、funcValuereturnした後でも Parameterに対した変更を維持すれば、funcname() -> ... 内でin out parameterで 宣言すべきだ。
これを確認ために
Screenshot 2023-10-14 at 10.27.33 PM.png

肆・庚 データターフ様に取扱可能なfunc 

元々のfuncの名前ではなく、let =  を使えて

func inchesToFeet (_ inches: Float) -> Float {
    return inches * 0.0833333
}
let toFeet = inchesToFeet

元々のfunc <name>ではなく、let <name> を使って funccallすることができます。

let result = toFeet(10)
// 0.8333333333

此れは let =  var   で、割り当てられたfuncは色んなターフの機能「他のfuncargumentで送られると、returnValueでも Returnされることもあります。

肆・辛 funcDataType

受け取る ParameterDataTypeReturnされるDataTypeを組み合わせて決定されます。
floatParameterで受け取ってfloatを結果でReturnするせいで floatになります。

(Float) -> Float

反面、IntDoubleParameterで受け取ってString結果をReturnするfuncstringになります。

(Int, Double) -> String

どのfuncが他のfuncParameterで受け取る為には
Parameterで受け取るfuncDataTypeを宣言すればいい

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 の場合にだけで行います。
Screenshot 2023-10-15 at 3.53.01 PM.png
Screenshot 2023-10-15 at 3.54.31 PM.png
この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 =  で割り当て
funccallする
closureExpressionParameterを受け取てvalueReturnする様に構成することもできます。
す八艇は

let multiply = {(_ val1:Int, _ val2: Int) -> Int in
return val1 * val2
}
let result = multiply(10,20)

ClosureExpressionは名前を持たず、
ParameterReturnTypeは( )中で含まれて、ClosureExpressionCodeの初めを指すためinKewWordを使えます。funcは名前があるClosure 表現式に過ぎないんです。
Swift 5.5でStructured Concurrencyを導入前に、ClosureExpression
AsyncMethodCallに対したcompletionHandlerを宣言するときにたまに使えます。
つまり、IOSアフリを開発するとき、あるTaskをバックグラウンドでTaskさせることで
アフリが他のTaskを続けられる様にOperatingSystemでりクエストしなければならない場合がどきどきあります。
その場合にはシステムがアフリにTaskが完了されることを知らせて、MethodCallする時宣言されたcompletionHandlerCallして結果を Return
します。
completionHandlerのコードは主にClosureExpression形で貢献実装されます。

伍・乙 shorthand argument name 「略式引受名前」

此れはname() -> ...Parameterの名前をとin Kewordを省略される様にしますArgumentを\$0,\$1,\$2などとReferenceできます。
Screenshot 2023-10-15 at 8.47.13 PM.png

伍・丙 SwiftClosure

コンピュータ工学用語でのClosureは、funcClosureExpressionなどの独立したコードブロックと、コードブロックの周りにある一つ以上のvar  を組み合わせたものを指します。
Screenshot 2023-10-15 at 9.19.34 PM.png
func Aは、func Bという名前のfuncReturnします。
func Bは内部エリア外の var counterに依存しています。
func AClosureReturnしています。
言い直して、func Bはcounter var  を持っています。または、閉じ込めているだと言えるので、伝統的なコンピュータ工学用語Closureでなされます。

要約

funcClosureそしてClosureExpressionは独立したコードブロックで、特定TaskRunningするためCallされる事が慣れる事ができるあり、
コードをStructされて再使用するメカニズムを提供します。

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?