_ не конвертируется в Int32 - Swift

Получаю эту ошибку и не понимаю, почему.

Эта строка ниже работает. Обратите внимание, что обе settingsVersion и settingsRelease являются строками:

let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease)

Но если я добавлю в смесь Int32, где settingsTimesUsed — это Int32, я получу ошибку «_», не конвертируемую в ошибку Int32.

let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease, settingRecord.settingTimesUsed])

Я также получаю ту же ошибку, если я делаю последний элемент полностью явным как Int32, например.

let a = 1 as Int32
let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease, a])

Любые идеи.


person Edward Hasted    schedule 24.07.2015    source источник


Ответы (2)


Добавление Int32 пытается переместить это из [String] в [AnyObject]. Swift никогда не будет автоматически выводить Any или AnyObject. Вы должны сделать это явным, если вам это нужно. В данном случае это будет:

let settings: [AnyObject] = [settingRecord.settingVersion, settingRecord.settingRelease, settingRecord.settingTimesUsed]
let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: settings)

Тем не менее, я бы убедиться, что вы действительно этого хотите. Это отбрасывает безопасность типов при запуске executeUpdate.

Если это интерфейс ObjC (который обычно небезопасен для типов), то он, вероятно, на самом деле принимает NSArray. В этом случае вы можете просто указать явно, позвонив:

...withArgumentsInArray: NSArray(objects: settingRecord.settingVersion, settingRecord.settingRelease, settingRecord.settingTimesUsed))
person Rob Napier    schedule 24.07.2015

Если вы хотите сохранить безопасность типов других переменных, вместо приведения всего массива к «AnyObject», вы можете просто привести эту конкретную переменную к строке, чтобы обойти эту проблему.

Например

let settingTimesUsedString = String(settingRecord.settingTimesUsed)

let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease, settingTimesUsedString])
person perNalin    schedule 09.09.2015