Статус | Ожидание | Реальность |
---|---|---|
Тип, объявленный как Nullable, является таковым и на стороне Swift / Пользоваться nullable-типами можно без изменений | Для примитивных типов требуется маппинг в специальные optional-типы / особенности с Char? |
Напишем код, использующий nullable-типы в Kotlin-е:
class NullableExample(
val optionalByte: Byte?,
val optionalShort: Short?,
val optionalInt: Int?,
val optionalLong: Long?,
val optionalFloat: Float?,
val optionalDouble: Double?,
val optionalString: String?,
val optionalBoolean: Boolean?
) {
fun optionalByteType(b: Byte?): Byte? {
return b
}
fun optionalShortType(s: Short?): Short? {
return s
}
fun optionalIntType(i: Int?): Int? {
return i
}
fun optionalLongType(l: Long?): Long? {
return l
}
fun optionalCharType(c: Char?): Char? {
return c
}
fun optionalStringType(s: String?): String? {
return s
}
fun optionalBooleanType(b: Boolean?): Boolean? {
return b
}
fun optionalCustomClassType(customClass: OptionalDataHolder?): OptionalDataHolder? {
return customClass
}
}
На стороне Swift-а nullable-типы Kotlin-а (за исключением String?
и Char?
)
представлены специальными типами данных:
Byte?
->KotlinByte?
UByte?
->KotlinUByte?
Short?
->KotlinShort?
UShort?
->KotlinUShort?
Int?
->KotlinInt?
UInt?
->KotlinUInt?
Long?
->KotlinLong?
ULong?
->KotlinULong?
Float?
->KotlinFloat?
Double?
->KotlinDouble?
Boolean?
->KotlinBoolean?
И есть два отдельных кейса с String?
и Char?
:
String?
->String?
Char?
->Any?
При передаче в аргументах литералов или nil-значений использование этих типов не отличается от Kotlin-а:
func optionalTypesExample3() {
let _ = OptionalParamsConstructorClass(
optionalByte: 1,
optionalShort: 1,
optionalInt: 1,
optionalLong: 1,
optionalFloat: 1.0,
optionalDouble: 1.0,
optionalParam: "123",
optionalBoolean: true
)
}
Так как Char?
превратился в Any?
, можно передать в качестве значения всё что угодно,
и это НЕ сломает программу.
При использовании Swift-овых типов данных требуется дополнительный маппинг:
func optionalTypesExample2(
byteType: Int8,
shortType: Int16,
intType: Int32,
longType: Int64,
floatType: Float,
doubleType: Double,
stringType: String,
booleanType: Bool
) {
let _ = OptionalParamsConstructorClass(
optionalByte: KotlinByte(value: byteType),
optionalShort: KotlinShort(value: shortType),
optionalInt: KotlinInt(value: intType),
optionalLong: KotlinLong(value: longType),
optionalFloat: KotlinFloat(value: floatType),
optionalDouble: KotlinDouble(value: doubleType),
optionalParam: stringType,
optionalBoolean: KotlinBoolean(value: booleanType)
)
}
При использовании optional-типов Swift-а маппинг становится более громоздким за счёт проверки на nil:
func optionalTypesExample(
optionalByte: Int8?,
optionalShort: Int16?,
optionalInt: Int32?,
optionalLong: Int64?,
optionalFloat: Float?,
optionalDouble: Double?,
optionalString: String?,
optionalBoolean: Bool?
) {
let _ = OptionalParamsConstructorClass(
optionalByte: (optionalByte != nil) ? KotlinByte(value: optionalByte!) : nil,
optionalShort: (optionalShort != nil) ? KotlinShort(value: optionalShort!) : nil,
optionalInt: (optionalInt != nil) ? KotlinInt(value: optionalInt!) : nil,
optionalLong: (optionalLong != nil) ? KotlinLong(value: optionalLong!) : nil,
optionalFloat: (optionalFloat != nil) ? KotlinFloat(value: optionalFloat!) : nil,
optionalDouble: (optionalDouble != nil) ? KotlinDouble(value: optionalDouble!) : nil,
optionalString: optionalString,
optionalBoolean: (optionalBoolean != nil) ? KotlinBoolean(value: optionalBoolean!) : nil,
)
}