SWIFT: предупреждения при компиляции, но хорошее поведение - PullRequest
0 голосов
/ 29 марта 2020

Мой код ведет себя правильно, за исключением того факта, что предупреждения генерируются при компиляции, я не знаю, откуда они берутся, так как я учусь самостоятельно. Как я могу изменить свой код (части между FIXME BEGIN и FIXME END), чтобы код компилировался без предупреждений?

Код:

protocol EqualsMethod {
    // Notice that the type-keyword  "Self" helps to solve the
    // curriously recurring interface pattern for direct self-reference
    // FIXME-begin
    func equality(my: Self) -> Bool;
    // FIXME-end
}

struct my_int : EqualsMethod {
    // FIXME-begin
    func equality(my: my_int) -> Bool{
        if (my.value == value){
            return true;
        }
        return false
    }
    // FIXME-end

    var value: Int;
}

// Returns the index of an element if it exists
// nil otherwise
func findIndex
    // FIXME-begin
    <T: EqualsMethod>
    // FIXME-end
    (valueToFind: T, array:[T]) -> Int? {

        // FIXME-begin
        for (k, e) in array.enumerated(){
            if (valueToFind.equality(my: e))
            {
                return k;
            }
        }
        // FIXME-end

        // Index not found
        return nil
}

let ints = [my_int(value: 1),
            my_int(value: 2),
            my_int(value: 3),
            my_int(value: 4),
            my_int(value: 5)]

print(findIndex(valueToFind: my_int(value: 2), array: ints))
print(findIndex(valueToFind: my_int(value: 0), array: ints))

ожидаемый вывод:

Optional(1)
nil

предупреждения:

main.swift:49:7: warning: expression implicitly coerced from 'Int?' to 'Any'                                            
print(findIndex(valueToFind: my_int(value: 2), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
main.swift:49:7: note: provide a default value to avoid this warning                                                    
print(findIndex(valueToFind: my_int(value: 2), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
                                                            ?? <#default value#>                                        
main.swift:49:7: note: force-unwrap the value to avoid this warning                                                     
print(findIndex(valueToFind: my_int(value: 2), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
                                                           !                                                            
main.swift:49:7: note: explicitly cast to 'Any' with 'as Any' to silence this warning                                   
print(findIndex(valueToFind: my_int(value: 2), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
                                                            as Any                                                      
main.swift:50:7: warning: expression implicitly coerced from 'Int?' to 'Any'                                            
print(findIndex(valueToFind: my_int(value: 0), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
main.swift:50:7: note: provide a default value to avoid this warning                                                    
print(findIndex(valueToFind: my_int(value: 0), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
                                                            ?? <#default value#>                                        
main.swift:50:7: note: force-unwrap the value to avoid this warning                                                     
print(findIndex(valueToFind: my_int(value: 0), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
                                                           !                                                            
main.swift:50:7: note: explicitly cast to 'Any' with 'as Any' to silence this warning                                   
print(findIndex(valueToFind: my_int(value: 0), array: ints))                                                            
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                             
                                                            as Any

1 Ответ

0 голосов
/ 29 марта 2020

findIndex() возвращает Int?, а затем print() приводит его к Any.

Чтобы после предупреждения применить одно из предложенных исправлений:

print(findIndex(valueToFind: my_int(value: 2), array: ints) ?? -1) // one option
print(findIndex(valueToFind: my_int(value: 2), array: ints)!) // another option, may crash
print(findIndex(valueToFind: my_int(value: 2), array: ints) as Any) // third option
...