iT邦幫忙

1

swift 函式回傳寫法

  • 分享至 

  • xImage

想詢問我底下寫法哪裡有誤
我想先call ac若小於10 再call ac2 最後回傳,請問我哪個部分寫錯了?
謝謝!

var ainput = 3

func ac(x:Int) -> Int{
    let k = x * 2
    if k < 10{
        let k = ac2(x: Int)
        return k
    }else{
        return k
    }
}
func ac2(x:Int) -> Int{
    let k = x * 2
    return k
}

let a = ac(x: ainput)
print("Answer is",a)

輸出error:cannot convert value of type 'Int.Type' to expected argument type 'Int'
let k = ac2(x: Int)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
powerc
iT邦新手 1 級 ‧ 2021-08-23 15:07:36
最佳解答

稍微通靈一下

var ainput = 3

func ac(x:Int) -> Int{
    let k = x * 2            // k=6
    if k < 10{               // 走這
        let k = ac2(x: Int)  // 如果是(x: x) 則還是6,若你要結果是12,改成(x: k)
        return k
    }else{
        return k
    }
}
func ac2(x:Int) -> Int{
    let k = x * 2
    return k
}

let a = ac(x: ainput)
print("Answer is",a)
tenno081 iT邦研究生 4 級 ‧ 2021-08-23 15:26:39 檢舉

我有找到線上編譯switf的網站
https://ithelp.ithome.com.tw/upload/images/20210823/20110132smrK0HWDrW.jpg

0
froce
iT邦大師 1 級 ‧ 2021-08-23 10:59:50
        let k = ac2(x: Int)

這句應該是

        let k = ac2(x)
看更多先前的回應...收起先前的回應...
姜義新 iT邦新手 4 級 ‧ 2021-08-23 11:25:53 檢舉

可是它變成這樣 erroerror: missing argument label 'x:' in call: missing argument label 'x:' in call

tenno081 iT邦研究生 4 級 ‧ 2021-08-23 13:00:12 檢舉
let k = ac2(x: Int)

改成

k = ac2(x: Int)

試試看

姜義新 iT邦新手 4 級 ‧ 2021-08-23 13:03:44 檢舉

變成上面這樣勒.....

tenno081 iT邦研究生 4 級 ‧ 2021-08-23 13:29:09 檢舉

我先說我沒學過SWIFT,所以想問問有沒有開中斷觀察程式的變化過?

powerc iT邦新手 1 級 ‧ 2021-08-23 14:13:51 檢舉

k = ac2(x: x)呢? 上面敘述說要有label

姜義新 iT邦新手 4 級 ‧ 2021-08-23 14:27:21 檢舉

powerc

var ainput = 3

func ac(x: Int) -> Int{
    var k = x * 2
    if k < 10{
        k = ac2(x: x)
        return k
    }else{
        return k
    }
}
func ac2(x: Int) -> Int{
    let k = x * 2
    return k
}

let a = ac(x: ainput)
print("Answer is",a)

可是我這樣跑出的答案是6餒,不是應該12嗎?

通靈亡 iT邦高手 1 級 ‧ 2021-08-23 14:36:59 檢舉

因為當 k < 10 ,你傳入 ac2 的是 x 而不是 k,也就是 3
相當於 k = ac2(x: 3)
所以 最後 ac2 會 return k = 3 * 2 = 6

tenno081 iT邦研究生 4 級 ‧ 2021-08-23 14:39:07 檢舉

https://ithelp.ithome.com.tw/upload/images/20210823/20110132o66nPiUbZI.jpg

我查了一下你們function 寫法
你呼叫應該是要這樣(?

let a = ac(ainput)
姜義新 iT邦新手 4 級 ‧ 2021-08-23 14:50:22 檢舉

tenno081
會missing label

姜義新 iT邦新手 4 級 ‧ 2021-08-23 14:57:40 檢舉

通靈亡
可是我傳入k = x*2
不就代表k 是12了 那這樣應該就會跑到ac2了不是嗎?

通靈亡 iT邦高手 1 級 ‧ 2021-08-23 15:11:55 檢舉

你是不是以為 ac 裡面的 k 跟 ac2 的 k 是共用的?
並不是好嗎,你有沒有看到你的 k 前面都有個宣告常數的 let?

也就是說,ac 裡面的 k,和 ac2 裡面的 k,是分開宣告的區域常數。 ac 的 k 常數並不會影響到 ac2 的 k 常數

YC iT邦研究生 2 級 ‧ 2021-08-23 16:03:12 檢舉

你可以用playground分析https://ithelp.ithome.com.tw/upload/images/20210823/201234578G8fpFKz2b.png

1
通靈亡
iT邦高手 1 級 ‧ 2021-08-23 14:39:05

請參考 Swift 3.0 以上的文件
裡面有寫到,呼叫 Fucntion 帶參數寫法應該是 函式名稱(參數名稱: 參數值)
而非 函式名稱(參數名稱: 參數型態),也不是像 force 大寫的 函式名稱(參數值)。

func greet(person: String) -> String {
    let greeting = "Hello, " + person + "!"
    return greeting
}
print(greet(person: "Anna"))

錯誤訊息很明顯地到訴你,你要傳到 ac2的應該是參數值而非型別

error:cannot convert value of type 'Int.Type' to expected argument type 'Int'

所以 let k = ac2(x: Int) 請改成 let k = ac2(x: x)
其中後面的 x ,是傳入函式 fun ac(x: Int) 的 x 參數。

看更多先前的回應...收起先前的回應...
姜義新 iT邦新手 4 級 ‧ 2021-08-23 15:02:58 檢舉

您說 寫法應該是 函式名稱(參數名稱: 參數值) ,那為何我寫func ac 不是寫func ac(x: x)呢?

通靈亡 iT邦高手 1 級 ‧ 2021-08-23 15:09:20 檢舉

姜義新

那為何我寫func ac 不是寫func ac(x: x)呢?

看清楚我回答裡面說的,「呼叫 Fucntion 帶參數」的「呼叫」兩個字
func ac (x: Int) 是定義函式的寫法: func 函式名稱(參數名稱: 參數型別)

呼叫的寫法則是你在倒數第二行寫的 let x = ac(x: ainput),你把定義函式跟呼叫函式的寫法搞混了

姜義新 iT邦新手 4 級 ‧ 2021-08-23 16:34:11 檢舉

喔喔 感謝解答!

froce iT邦大師 1 級 ‧ 2021-08-23 16:35:17 檢舉

我是真的忘了swift有這個設計...

通靈亡 iT邦高手 1 級 ‧ 2021-08-24 10:37:41 檢舉

froce
那是 Swift 3 之後的特性
Swift 2 => Swift 3 有蠻多變動,我當初也是碰 3 踩雷的時候才發現

0
YC
iT邦研究生 2 級 ‧ 2021-08-23 15:53:39

我先翻譯了一下你的程式

var ainput = 3

func 函式一號(一號參數:Int) -> Int{
    let 一號結果 = 一號參數 * 2
    if 一號結果 < 10{
        let 一號結果 = 函式二號(二號參數: Int)
        return 一號結果
    }else{
        return 一號結果
    }
}
func 函式二號(二號參數: Int) -> Int{
    let 二號結果 = 二號參數 * 2
    return 二號結果
}

let a = 函式一號(一號參數: ainput)
print("Answer is", a)

錯誤Cannot convert value of type 'Int.Type' to expected argument type 'Int'是說,
函式二號(二號參數: Int)不應該用Int當參數!
就像函式一號(一號參數: 輸入),必須用ainput當參數一樣。

姜義新 iT邦新手 4 級 ‧ 2021-08-23 16:32:48 檢舉

了解了 感謝

0
Pulin
iT邦新手 5 級 ‧ 2021-08-23 16:04:43

感覺你把定義跟呼叫搞混了/images/emoticon/emoticon06.gif
這是定義,顧名思義就是寫好你這個func的參數、回傳型態跟裡面要做的事情
以這個例子來說
參數為x,型態為Int
回傳型態也是Int
裡面要把傳進去的 x * 2 之後再回傳

func ac(x: Int) -> Int {
    let k = x * 2
    return k
}

這是呼叫,呼叫你剛剛定義好的func
這邊呼叫時需要丟一個參數進去,參數必須是Int型態
以這個例子為例就是丟一個3進去
func則會回傳6

let callAC = ac(x: 3)
姜義新 iT邦新手 4 級 ‧ 2021-08-23 16:33:25 檢舉

原來如此謝謝!

我要發表回答

立即登入回答