redisky
redisky

Reputation: 97

Swift error, cannot convert type Int to int 16

This function compares the number with the sum of the cubes of the components of this number. For example abc=a^3 + b^3 + c^3. There is an error converting, please help.

func triKuba ( i:Int16, k:Int16, var array:[Int16]=[] ) ->Int16{

    for var i=100;i<1000; i++ {
        array.append(Int16(i))
        if array[i] == pow(array[i]/10) + pow(array[i]/100) + pow(array[i]%10)  {
            return array[i]
        } else {
            return 0
        }
    }
}
 triKuba(0, k: 0)

next error in line around method pow 'Cannot invoke pow with argument list of type Int16' if I understood correctly, method pow is a^3

Upvotes: 2

Views: 2473

Answers (4)

0x416e746f6e
0x416e746f6e

Reputation: 10136

I strongly suspect this is what you are looking for:

func arithmeticRoot3(var value: Int) -> Int {
    var result = 0

    while value > 0 {
        let digit = value % 10
        result += digit * digit * digit
        value /= 10
    }

    return result
}

func triKuba() -> [Int] {
    return (100...999).filter() {
        $0 == arithmeticRoot3($0)
    }
}

print(triKuba()) // [153, 370, 371, 407]

Upvotes: 1

Rafał Sroka
Rafał Sroka

Reputation: 40030

The method you posted had several syntax issues. I fixed them. Working method below:

func triKuba ( i:Int16, k:Int16, var array:[Int16]=[] ) ->Int16{

    for var i=100;i<1000; i++ {
        array.append(Int16(i))

        if Double(array[i]) == pow(Double(array[i])/10, 3.0) + pow(Double(array[i]/100), 3.0) + pow(Double(array[i]%10), 3.0)  {
            return array[i]
        } else {
            return 0
        }
    }
}

Error you were getting was about missing cast from Int to Int16(i)

Upvotes: 0

Jordan Smith
Jordan Smith

Reputation: 10378

Rather than just solving your issue, I'm going to explain what the problem is, and why it throws an error. With this information you should be able to fix the issue (and similar ones in the future!).

In Swift, you can't always do things like multiply an Int with a Float, or return an Int16 from a Double type return function. To you, it might be obvious that 'casting' the variable to the intended type would be fine - but the compiler doesn't know that.

If you're sure it will be safe, you can 'cast' variables to the required type:

Int(int16Variable) // int16Variable has been casted to an 'Int'.

Upvotes: 1

Blake Lockley
Blake Lockley

Reputation: 2961

in your for loop you are declaring a new i variable which is implied to be of type Int as opposed to Int16. (Due to shadowing this is the variable being used in your function body, the parameter i you pass in is never being used.

I would advise either changing the type for your function parameters to be of type Int like so:

func triKuba (var i: Int, var k: Int, var array: [Int]=[] ) -> Int {

or cast your Int16 variables to Ints like so:

array.append(Int16(i))

Upvotes: -1

Related Questions