CodeGym /コース /Swift SELF /Function no sengen: parameta to kekka

Function no sengen: parameta to kekka

Swift SELF
レベル 9, レッスン 1
使用可能

1. Naze functions ga hitsuyō ka

Function o tsukawazu ni puroguramu o kaku to, kopipasta ga sakuhin saremasu: onaji nyūryoku, han'i kakunin, waribiki keisan, soshite shutsuryoku no ronri ga betsu betsu no basho de kurikaesaremasu. Saisho wa sore ga sasayaka ni mietemo, ato de wa shutsuryoku no keishiki o kaete, sono onaji 6 gyō o zenbun sagasazu oenaku narimasu. Function wa, kurikaeshite okonau dōsa ya keisan ni namae o tsukete, hitsuyō na bun dake tsukau tame no hōhō desu.

Function wa "mini mashin" to shite omoiukaberaremasu: input data o komeru to, mashin ga shigoto o shite, kekka o kaesu ka, mata wa tada dōsa o okonaimasu (tatoeba, hyōji suru). Taisetsu na point wa, function wa contract da to iu koto desu. "Kono yō na input o kureba, watashi wa kore o shimasu" to yakusoku shimasu.

Tsugi wa, ichiban chiisana function no rei desu:

func sayHello() {
    print("Hello! I am a function 🙂")
}

sayHello() // Hello! I am a function 🙂

Chūi shite kudasai: mazu function o sengen shi (func o tsukatte), sono ato de yobidasu (sayHello() o tsukatte) no desu.

2. Function no sekkei: func, namae, parameta, karada

Hito ga function no sengen o hajimete miru toki, sore wa "kantan na dōsa no mawari ni sukoshi okuman" ni miete shimaimasu. Demo jissai ni wa totemo riyō-teki desu: Swift wa function ga nani o uketori, nani o kaesu ka o meishite teikyou suru yō ni yokū motomemasu. Kore ga contract de, compiler ga anata no kawari ni chekku shite kuremasu (soshite kore ga Swift ga type o kono miyō ni aisuru riyū no hitotsu desu).

Function no signature (sūchi de iu "header") wa futsū tsugi no yō ni yomasemasu:

func name(parameters) -> resultType { body }

Function no bubun o hyō de miru to, oboeyasuku narimasu:

Bubun Rei Naze hitsuyō ka
Kagi kotoba
func
Swift ni "ima kara function desu" to tsutaeru
Namae
square
Namae de function o yoberu yō ni suru tame
Parameta
(x: Int)
Function no input data
Kekka
-> Int
Kekka no type (function ga kaesu to yakusoku suru mono)
Karada
{ ... }
Yobidashi de jikkō sareru code

Ichiban chiisana "function ga nanika o keisan shite kaesu" no rei desu:

func square(x: Int) -> Int {
    return x * x
}

let v = square(x: 6)
print(v) // 36

Koko de taisetsu na no wa, square wa kekka o hyōji shinai koto desu. Sore wa kaesu dake desu. Hyōji wa betsu no suteppu desu. Kore ni yotte function wa motto fūtsū ni tsukaemasu: kyō wa hyōji, ashita wa hikaku, asatte wa hensū ni hozon, to iu yō ni desu.

3. Parameta to argument: "naka" to "soto" o mizeru na

Parameta to argument wa nite iru kotoba na no de, atama ga sore o onaji mono da to omoi-komi-gachi desu. Demo sa wa totemo jissai-teki desu: parameta wa function no sengen no naka ni iru, soshite argument wa yobidashi no basho ni aru no desu. Sūchi de iuto, parameta wa "slot", argument wa sono slot ni watasu gutaiteki na atai desu.

Chiisana rei de mirimashō. Koko de wa function ga aisatsu no bun o tsukuru to shimasu:

func greeting(name: String) -> String {
    return "Hello, \(name)!"
}

let text = greeting(name: "Anya")
print(text) // Hello, Anya!

Sengen no naka de name wa parameta desu. Yobidashi no toki no "Anya" wa argument desu.

Function wa fukusū no parameta mo ukeraremasu. Sono toki wa, sore wa fukusū no input o motsu "formula" no yō ni narimasu:

func rectangleArea(width: Int, height: Int) -> Int {
    return width * height
}

let area = rectangleArea(width: 4, height: 7)
print(area) // 28

Yobidashi ga totemo yomi-yasui koto ni kizuite kudasai: width: 4, height: 7. Junban o wasurete mo, code ga jibun jishin o setsumei shite kuremasu.

4. Modoru atai to return

Modoru atai wa, taihō no takusan no function ga sonomama no tame ni kakaremasu. Soko de wa 2-tsu no rule o rikai suru koto ga daiji desu. Dai ichi ni, signature ni -> Type ga areba, function wa sono type no atai o kaesaneba narimasen. Dai ni ni, atai wa return o tsūjite dake kaesemasu.

Saishō no rei desu: function ga sūchi no shōchi o hanbetshite, moji-retsu o kaeshimasu:

func signDescription(value: Int) -> String {
    if value > 0 {
        return "positive"
    } else if value < 0 {
        return "negative"
    } else {
        return "zero"
    }
}

print(signDescription(value: 10))  // positive
print(signDescription(value: 0))   // zero

Kisoku-teki na taiō ni chūi shite kudasai: subete no bunki if/else if/else ga String o kaeshimasu. Moshi hitotsu no bunki demo return o wasureru to, compiler wa "yakusoku shita String wa doko?" to iimasu.

Mō hitotsu taisetsu na ten wa, return ga atai o kaesu dake de wa naku, sugu ni function no jikkō o owaraseru koto desu. return no ato ni kakareta mono wa, sono bunki de wa jikkō sarenaku narimasu.

5. Void: function wa "suru" ga, nani mo kaesanai

Jissai no program de wa, takusan no function ga nani ka yūyō na mono o kaeshimasen: hyōji, nyūryoku yomi-tori, fairu e no hozon, gamen hyōji, risueto sōshins. Ima no dan-kai de ichiban wakari-yasui no wa hyōji desu: print() mo nani mo kaesanai, tada dōsa o suru dake desu.

Moshi function ga kekka o kaesanai nara, sore wa Void o kaesu to iimasu. Swift de wa Void wa kara no tuple () no alias desu (sūchi de iu "kara no atai"). Futsū wa signature ni -> Void wa kaki masen: arrow ga nai dake de "nani mo kaesanai" to iu imi ni narimasu.

Hyōda o hyōji suru function no rei desu:

func printHeader(title: String) {
    print("=== \(title) ===")
}

printHeader(title: "My program") // === My program ===

Tokidoki return wa Void function de mo arawaremasu. Demo sore wa "kekka o kaesu" tame de wa naku, hayaku nukeru tame desu. Sore wa function no naka no "stop word" no yō na mono desu.

Rei:

func printIfPositive(value: Int) {
    if value <= 0 {
        return
    }
    print("The number is positive")
}

printIfPositive(value: -3) // (nothing will be printed)
printIfPositive(value: 5)  // The number is positive

Kore wa totemo yūyō na method desu: fukai if no sōsetsu no kawari ni, hayaku nukete, main path o motto sunao ni dekimasu.

6. Function no contract: return to henkō fuka na parameta

Subete no bunki wa atai o kaesanakereba naranai

return no error wa, shoshinsha ga compiler o mite "kare wa komaka sugiru" to omou ichiban yoku aru gen'in no hitotsu desu. Demo compiler wa komaka sugiru no de wa arimasen: kare wa anata no contract o mamorimasu. Moshi function ga Int o yakusoku suru nara, dono scenario demo Int o kaesanakereba narimasen.

Tatoeba, konna kākata wa dame desu (anti-pattern to shite, ❌ compiler ni tōrimasen):

func badSign(value: Int) -> String {
    if value > 0 {
        return "positive"
    }
    // if value <= 0 - nani o kaesu? compiler wa project o kodo sasenai
}

Tadashii katachi wa, tsuneni "sore igai" o junbi suru koto desu:

func goodSign(value: Int) -> String {
    if value > 0 {
        return "positive"
    } else {
        return "not positive"
    }
}

print(goodSign(value: 0)) // not positive

Hai, toki ni wa "amari" ni mieru koto mo arimasu. Demo sore de mo, anata no function o yobu hito wa, kekka ga tsuneni atte, shikamo tadashii type da to shinjiraremasu.

Function no naka no parameta wa let no yō ni

Shoshinsha wa yoku "parameta o work variable to shite sairiyō shiyō" to shimasu: soko ni nanika o tashi, moji-retsu o keri, waribiki o kaeru. Soko de Swift wa "dame" to iimasu. Riyū wa kantan de, parameta wa input na no de, constant no yō ni miru hō ga yoi kara desu. Function wa atai o uke, sore de hatarakimasu; "nyūryoku" sono mono o subete irekaeru wake de wa arimasen.

Moshi atai o kaetai nara, var de local copy o tsukutte kudasai. Sore wa chitto mushiro ni mieru kamoshiremasen ga, totemo meisei desu.

Rei:

func withPrefix(text: String, prefix: String) -> String {
    var result = text
    result = prefix + result
    return result
}

print(withPrefix(text: "world", prefix: "hello ")) // hello world

Koko de text wa sawarimasen. result o tsukuri, sore de hatarakimasu. Kore wa, ato de fūki na kōka: input ga "totsuzen kawatta" to iu futashika-sa kara mamoru shūkan desu.

7. Rei: konsōru apuri DiscountBuddy

Kore kara, tsugi no koza de hattensaseru chiisana puroguramu o tsukurimasu. Idea wa kantan desu: "waribiki keisan-ki". Yūzā ga nedan to waribiki-wariai o nyūryoku shi, puroguramu ga saishū nedan o keisan shite kekka o hyōji shimasu. Mokuteki wa sūgaku de wa naku, function ga dō yatte code no nagai katachi o seiri sareta block ni kaeru ka o miru koto desu.

Aisatsu

Senshite aisatsu no function o tsukurimasu:

func printWelcome() {
    print("DiscountBuddy v0.1")
    print("Let's calculate the price with a discount.")
}

printWelcome()
// DiscountBuddy v0.1
// Let's calculate the price with a discount.

Sūchi no nyūryoku

Tsugi ni, sūchi no nyūryoku o betsu no function ni dashimasu. Ima wa kanarazu chokkyō ni: moshi yūzā ga mechakucha na mono o ireta nara, 0 o ukerimasu. Kore wa kanzen na validation de wa arimasen ga, ima no kaisetsu dan'i nara jūbun desu:

func readInt(prompt: String) -> Int {
    print(prompt, terminator: " ")
    let line = readLine() ?? ""
    return Int(line) ?? 0
}

let x = readInt(prompt: "Enter a number:")
print("You entered \(x)")

Waribiki tsuki nedan no keisan

Soshite saigo ni, waribiki tsuki nedan no keisan function desu. Kono function wa kekka o kaeshite, hyōji wa shimasen:

func discountedPrice(price: Int, discountPercent: Int) -> Int {
    let discount = price * discountPercent / 100
    return price - discount
}

let finalPrice = discountedPrice(price: 1000, discountPercent: 15)
print(finalPrice) // 850

Top-level code to shite scenario o tsunagu

Ima, kore o hitotsu no tsunagatta top-level code ni shimasu. Sore wa "gōsei" de atte, "gomi-bako" de wa arimasen:

func printWelcome() {
    print("DiscountBuddy v0.1")
}

func readInt(prompt: String) -> Int {
    print(prompt, terminator: " ")
    let line = readLine() ?? ""
    return Int(line) ?? 0
}

func discountedPrice(price: Int, discountPercent: Int) -> Int {
    let discount = price * discountPercent / 100
    return price - discount
}

printWelcome()

let price = readInt(prompt: "Enter the price (euro):")
let percent = readInt(prompt: "Enter the discount (%):")

let result = discountedPrice(price: price, discountPercent: percent)
print("Final price: \(result) euro")

Chūi shite kudasai. Ima wa top-level no bubun ga, hotondo futsū no bun no yō ni yomerimasu: "aisatsu suru → nedan o kiku → waribiki o kiku → keisan suru → hyōji suru". Sore koso ga, function o aiseru riyū desu: code o wakari-yasui scenario ni kaete kureru kara desu.

Function o dō kangaeru ka: input → function → output

Hajimete no koro wa, function o mahō no yō ni kanjiyasui desu: "yobitara nanika ga doko ka de okotta". Sore o fusegu tame ni, kantan na model o atama ni irete okuto yoi desu: function wa data no henkan-ki desu. Toki ni wa, print no yō na side effect o tomonaimasu. Sō iu imi de wa, sore ni wa input, process, soshite (baai ni yotte) output ga arimasu.

Chiisana block diagram ga sore o teichaku sasemasu:

flowchart LR
    A[Arguments at call time] --> B[Function body]
    B --> C[return value]
    B --> D["side effect: print()"]

Watashitachi no DiscountBuddy de wa, readInt(prompt:) ga prompt no bun o uke, sore o hyōji shi (side effect), nyūryoku o yomikomi, soshite Int o kaeshimasu. Soshite discountedPrice(...) wa zenzen hyōji shinai de, tada sūchi o kaesu dake desu. Kono bunri wa hijō ni tsuyoi shūkan desu: "keisan suru function" wa me de tashikameyasuku, futsū wa koware nikui desu.

8. Yoku aru ayamachi

Error #1: function ga atai o kaesu to yakusoku shite iru no ni, subete no bunki ni return ga nai.
Kore wa teppan desu: -> Int to kaki, if value > 0 { return 1 } to shite, sono ato no else o wasuremasu. Compiler wa koko de anata no ichiban no tomodachi desu: "kekka ga kimatte inai scenario" no aru apuri o dasasenai kara desu. Naosu hōhō wa shūkan desu: function ga atai o kaesu nara, kokoro no naka de "sore igai no subete no baai de wa nani ga kaeru?" to tazunemasu.

Error #2: keisan to hyōji o hitsuyō mo naku mazete shimau.
Shoshinsha wa yoku, function de keisan mo shi, hyōji mo shimasu. Soshite ato de, kekka o hoka no basho de hyōji nashi de tsukaitai to natte, kaichoku ga hitsuyō ni narimasu. Kono koza no reberu de wa, "keisan shite kaesu" to "user ni kirei ni miseru" o betsu function ni suru ka, top-level code ni suru ka o bunri suru no ga hijō ni yūyō desu.

Error #3: parameta o chokusetsu ni kaeyō to suru.
Function no naka de wa parameta wa constant no yō ni furu-mai, soshite Swift wa value = value + 1 no yō na mono o kaki-komasemasen. Sore wa "language no komakai iji" de wa naku, mayoi o fusegu tame no bōgo desu: input wa input no mama de aru beki desu. Moshi atai o "mawasu" hitsuyō ga aru nara, local hensū var temp = value o tsukuri, sore o kaete kudasai.

Error #4: Void function ni taisuru machigatta kitai.
Tokidoki let x = printWelcome() to shite, x ga moji-retsu ka nani ka yūyō na mono da to omoitaku narimasu. Demo Void to wa, function ga nani mo kaesanai de, tada dōsa o okonau to iu imi desu. Moshi atai ga hitsuyō nara, function wa sore ni au type (tatoeba String) o kaeshi, naka ni return o motsu beki desu.

Error #5: "subete no baai ni taiō suru" nagai function.
Function no riyō ni wa yorokobi no amari, 200 gyō mo aru process() o tsukutte, yomi, kenshō, keisan, hyōji o subete soko ni irete shimau koto ga arimasu. Keishiki-teki ni wa function demo, jissai ni wa onaji nagasa no code no katachi ga tada block no naka ni hikkari-itte iru dake desu. Hajime no rule to shite wa, 10-byou de setsumei dekinai function, mata wa doEverythingAndMore() mitai na namae ni naru nara, motto chiisaku wakeru toki desu.

1
タスク
Swift SELF, レベル 9, レッスン 1
ロック未解除
報酬の二乗
報酬の二乗
1
タスク
Swift SELF, レベル 9, レッスン 1
ロック未解除
レポートの区切り線
レポートの区切り線
1
タスク
Swift SELF, レベル 9, レッスン 1
ロック未解除
都市の天気
都市の天気
1
タスク
Swift SELF, レベル 9, レッスン 1
ロック未解除
統計ボードの分数表示
統計ボードの分数表示
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION