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

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

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

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])

Есть идеи.

2 ответа

Решение

Добавление Int32 пытается переместить это из [String] в [AnyObject], Свифт никогда не выведет автоматически 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))

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

Например

let settingTimesUsedString = String(settingRecord.settingTimesUsed)

let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease, settingTimesUsedString])
Другие вопросы по тегам