想詢問我底下寫法哪裡有誤
我想先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)
稍微通靈一下
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)
let k = ac2(x: Int)
這句應該是
let k = ac2(x)
可是它變成這樣 erroerror: missing argument label 'x:' in call: missing argument label 'x:' in call
let k = ac2(x: Int)
改成
k = ac2(x: Int)
試試看
變成上面這樣勒.....
我先說我沒學過SWIFT,所以想問問有沒有開中斷觀察程式的變化過?
k = ac2(x: x)
呢? 上面敘述說要有label
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嗎?
因為當 k < 10 ,你傳入 ac2 的是 x 而不是 k,也就是 3
相當於 k = ac2(x: 3)
所以 最後 ac2 會 return k = 3 * 2 = 6
我查了一下你們function 寫法
你呼叫應該是要這樣(?
let a = ac(ainput)
tenno081
會missing label
通靈亡
可是我傳入k = x*2
不就代表k 是12了 那這樣應該就會跑到ac2了不是嗎?
你是不是以為 ac 裡面的 k 跟 ac2 的 k 是共用的?
並不是好嗎,你有沒有看到你的 k 前面都有個宣告常數的 let?
也就是說,ac 裡面的 k,和 ac2 裡面的 k,是分開宣告的區域常數。 ac 的 k 常數並不會影響到 ac2 的 k 常數
你可以用playground分析
請參考 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 參數。
您說 寫法應該是 函式名稱(參數名稱: 參數值) ,那為何我寫func ac 不是寫func ac(x: x)呢?
那為何我寫func ac 不是寫func ac(x: x)呢?
看清楚我回答裡面說的,「呼叫 Fucntion 帶參數」的「呼叫」兩個字
func ac (x: Int) 是定義函式的寫法: func 函式名稱(參數名稱: 參數型別)
呼叫的寫法則是你在倒數第二行寫的 let x = ac(x: ainput),你把定義函式跟呼叫函式的寫法搞混了
我先翻譯了一下你的程式
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當參數一樣。
感覺你把定義跟呼叫搞混了
這是定義
,顧名思義就是寫好你這個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)