الفرق بين المراجعتين ل"Kotlin/idioms"
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:التعابير الاصطلاحيّة في لغة Kotlin}}</noinclude> تعرِض هذه الصفحة مجموعةً من التعابير ا...') |
(مراجعة) |
||
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين) | |||
سطر 1: | سطر 1: | ||
− | <noinclude>{{DISPLAYTITLE:التعابير | + | <noinclude>{{DISPLAYTITLE:التعابير الاصطلاحية (Idioms) في لغة Kotlin}}</noinclude> |
− | تعرِض هذه الصفحة | + | تعرِض هذه الصفحة عددًا من التعابير الاصطلاحيّة المستخدَمة بكثرةٍ في لغة [[Kotlin]]، ولأيّ اصطلاحٍ جديدٍ لم يُذكَر فيمكنك [https://wiki.hsoub.com/index.php?title=Kotlin/idioms&veaction=edit تعديل هذه الصفحة] لإضافته. |
− | + | ||
+ | = إنشاء كائنات نقل البيانات DTO: Data Transfer Objects (الكائنات POJO/POCO) = | ||
ليكن الصنف (class) الآتي باسم <code>Customer</code>:<syntaxhighlight lang="kotlin"> | ليكن الصنف (class) الآتي باسم <code>Customer</code>:<syntaxhighlight lang="kotlin"> | ||
data class Customer(val name: String, val email: String) | data class Customer(val name: String, val email: String) | ||
− | </syntaxhighlight>وله التوابع | + | </syntaxhighlight>وله التوابع الوظيفيّة (functional methods) الآتية: |
− | * توابع getter (وتوابع setter في حالة المتحولات <code>var</code>) لكافة الخاصّيّات (properties) | + | * توابع getter (وتوابع setter في حالة المتحولات من النوع <code>var</code>) لكافة الخاصّيّات (properties) |
* <code>equals()</code> | * <code>equals()</code> | ||
* <code>hashCode()</code> | * <code>hashCode()</code> | ||
* <code>toString()</code> | * <code>toString()</code> | ||
− | * <code>copy()</code> | + | * <code>copy()</code> |
− | * <code>component1()</code> و <code>component2()</code> | + | * <code>component1()</code> و <code>component2()</code> ...إلخ. وذلك لكافة الخاصّيّات (properties) في الصنف (راجع [[Kotlin/data classes|أصناف البيانات [data classes]]]) |
− | == تحديد القيم | + | == تحديد القيم الافتراضية لمعاملات الدوال (Function Parameters) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun foo(a: Int = 0, b: String = "") { ... } | fun foo(a: Int = 0, b: String = "") { ... } | ||
− | </syntaxhighlight> | + | </syntaxhighlight>المزيد عن [[Kotlin/functions|الدوال (functions)]]. |
− | == ترشيح عناصر القائمة | + | == ترشيح (Filter) عناصر القائمة == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val positives = list.filter { x -> x > 0 } | val positives = list.filter { x -> x > 0 } | ||
سطر 24: | سطر 25: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == ملء | + | == ملء سلسلة نصية (String Interpolation) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
println("Name $name") | println("Name $name") | ||
− | </syntaxhighlight> | + | </syntaxhighlight>المزيد عن [[Kotlin/basic types|السلاسل النصيّة (strings)]]. |
− | == | + | == التحقق من القيمة باستخدام تعبير when == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
when (x) { | when (x) { | ||
− | + | is Foo -> ... | |
− | + | is Bar -> ... | |
− | + | else -> ... | |
} | } | ||
− | |||
− | == المرور بعناصر | + | |
+ | </syntaxhighlight>المزيد عن [[Kotlin/control flow|تعبير <code>when</code>.]] | ||
+ | |||
+ | == المرور بعناصر كائن Map أو قائمة من الثنائيات (Pairs) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
for ((k, v) in map) { println("$k -> $v") } | for ((k, v) in map) { println("$k -> $v") } | ||
</syntaxhighlight>مهما كانت k أو v. | </syntaxhighlight>مهما كانت k أو v. | ||
− | == استخدام المجالات ( | + | == استخدام المجالات (Ranges) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
− | for (i in 1..100) { ... } // المجال مغلق ويتضمن 100 قيمة | + | for (i in 1..100) { ... } // المجال مغلق ويتضمن 100 قيمة |
− | for (i in 1 until 100) { ... } // مجال نصف مفتوح ولا يشمل 100 قيمة | + | for (i in 1 until 100) { ... } // مجال نصف مفتوح ولا يشمل 100 قيمة |
− | for (x in 2..10 step 2) { ... } // مجال بخطوة ثابتة 2 | + | for (x in 2..10 step 2) { ... } // مجال بخطوة ثابتة بمقدار 2 |
− | for (x in 10 downTo 1) { ... } // مجال تنازلي | + | for (x in 10 downTo 1) { ... } // مجال تنازلي |
− | if (x in 1..10) { ... }// قيمة المتحول | + | if (x in 1..10) { ... } // قيمة المتحول تقع ة في المجال من 1 حتى 10 |
− | </syntaxhighlight> | + | |
+ | |||
+ | </syntaxhighlight>المزيد عن [[Kotlin/ranges|المجالات (ranges)]]. | ||
− | == قائمة | + | == قائمة القراءة فقط (Read-Only List) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val list = listOf("a", "b", "c") | val list = listOf("a", "b", "c") | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | == كائن Map للقراءة فقط == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val map = mapOf("a" to 1, "b" to 2, "c" to 3) | val map = mapOf("a" to 1, "b" to 2, "c" to 3) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == الوصول إلى | + | == الوصول إلى كائن Map == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
− | println(map["key"]) | + | println(map["key"]) |
map["key"] = value | map["key"] = value | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | == الخاصية الكسولة (Lazy Property) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val p: String by lazy { | val p: String by lazy { | ||
− | + | // عمليات على السلسلة النصيّة | |
} | } | ||
− | </syntaxhighlight> | + | |
+ | |||
+ | </syntaxhighlight>المزيد عن [[Kotlin/delegated properties|الخاصيّات الكسولة (lazy properties)]]. | ||
== الدوال الإضافية (Extension Functions) == | == الدوال الإضافية (Extension Functions) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
− | fun String.spaceToCamelCase() { ... } | + | fun String.spaceToCamelCase() { ... } |
"Convert this to camelcase".spaceToCamelCase() | "Convert this to camelcase".spaceToCamelCase() | ||
− | |||
− | == إنشاء نمط | + | |
+ | </syntaxhighlight>المزيد عن [[Kotlin/extensions|الدوال الإضافيّة (extension functions)]]. | ||
+ | |||
+ | == إنشاء نمط التصميم Singleton == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
object Resource { | object Resource { | ||
− | + | val name = "Name" | |
} | } | ||
+ | |||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 92: | سطر 103: | ||
val files = File("Test").listFiles() | val files = File("Test").listFiles() | ||
println(files?.size) | println(files?.size) | ||
+ | |||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 98: | سطر 111: | ||
val files = File("Test").listFiles() | val files = File("Test").listFiles() | ||
println(files?.size ?: "empty") | println(files?.size ?: "empty") | ||
+ | |||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 104: | سطر 119: | ||
val values = ... | val values = ... | ||
val email = values["email"] ?: throw IllegalStateException("Email is missing!") | val email = values["email"] ?: throw IllegalStateException("Email is missing!") | ||
+ | |||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == الحصول على العنصر الأول من مجموعة قد تكون | + | == الحصول على العنصر الأول من مجموعة قد تكون فارغة == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val emails = ... // من الممكن أن تكون فارغة | val emails = ... // من الممكن أن تكون فارغة | ||
val mainEmail = emails.firstOrNull() ?: "" | val mainEmail = emails.firstOrNull() ?: "" | ||
− | </syntaxhighlight> | + | |
+ | |||
+ | </syntaxhighlight>المزيد عن [[Kotlin/collections|المجموعات (collections)]]. | ||
== تنفيذ if not null == | == تنفيذ if not null == | ||
سطر 116: | سطر 135: | ||
val value = ... | val value = ... | ||
value?.let { | value?.let { | ||
− | + | ... // سينفذ هذا الجزء إن لم تكن القيمة null | |
} | } | ||
+ | |||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == تعيين | + | == تعيين Map للقيم من النوع nullable إن لم تكن بقيمة <code>null</code> == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val value = ... | val value = ... | ||
+ | |||
val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull | val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull | ||
− | |||
− | == أمر العودة (return) في | + | |
+ | </syntaxhighlight>المزيد عن [[Kotlin/null safety|استخدام القيمة null وأمانها]]. | ||
+ | |||
+ | == أمر العودة (<code>return</code>) في تعبير <code>when</code> == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun transform(color: String): Int { | fun transform(color: String): Int { | ||
− | + | return when (color) { | |
− | + | "Red" -> 0 | |
− | + | "Green" -> 1 | |
− | + | "Blue" -> 2 | |
− | + | else -> throw | |
− | |||
IllegalArgumentException("Invalid color param value") | IllegalArgumentException("Invalid color param value") | ||
− | + | } | |
} | } | ||
− | </syntaxhighlight> | + | </syntaxhighlight>المزيد عن [[Kotlin/returns|أمر العودة (<code>return</code>)]]. |
− | == تعبير <code>try/catch</code> == | + | == تعبير <code>try</code>/<code>catch</code> == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun test() { | fun test() { | ||
+ | val result = try { | ||
+ | count() | ||
+ | } catch (e: ArithmeticException) { | ||
+ | throw IllegalStateException(e) | ||
+ | } | ||
+ | // العمل بالنتائج | ||
+ | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </syntaxhighlight> | + | </syntaxhighlight>المزيد عن [[Kotlin/exceptions|الاستثناءات (exceptions)]]. |
== تعبير <code>if</code> == | == تعبير <code>if</code> == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun foo(param: Int) { | fun foo(param: Int) { | ||
+ | val result = if (param == 1) { | ||
+ | "one" | ||
+ | } else if (param == 2) { | ||
+ | "two" | ||
+ | } else { | ||
+ | "three" | ||
+ | } | ||
+ | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </syntaxhighlight> | + | </syntaxhighlight>المزيد عن [[Kotlin/control flow|تعبير الشرط if]]. |
− | == استخدام الشكل البنائي للتوابع ( | + | == استخدام الشكل البنائي (Builder-Style) للتوابع (Methods) التي تعيد النوع <code>Unit</code> == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun arrayOfMinusOnes(size: Int): IntArray { | fun arrayOfMinusOnes(size: Int): IntArray { | ||
− | + | return IntArray(size).apply { fill(-1) } | |
} | } | ||
سطر 182: | سطر 203: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == الدالة | + | == الدالة وحيدة التعبير (Single-Expression Functions) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun theAnswer() = 42 | fun theAnswer() = 42 | ||
</syntaxhighlight>وهذا مماثل تمامًا للشكل:<syntaxhighlight lang="kotlin"> | </syntaxhighlight>وهذا مماثل تمامًا للشكل:<syntaxhighlight lang="kotlin"> | ||
fun theAnswer(): Int { | fun theAnswer(): Int { | ||
− | + | return 42 | |
} | } | ||
− | </syntaxhighlight> | + | </syntaxhighlight>وقد تُدمَج مع تعابير اصطلاحيّة أخرى بهدف الحصول على شيفرة أقصر، مثل دمجها مع تعبير <code>when</code> بالشكل:<syntaxhighlight lang="kotlin"> |
fun transform(color: String): Int = when (color) { | fun transform(color: String): Int = when (color) { | ||
− | + | "Red" -> 0 | |
− | + | "Green" -> 1 | |
− | + | "Blue" -> 2 | |
− | + | else -> throw | |
IllegalArgumentException("Invalid color param value") | IllegalArgumentException("Invalid color param value") | ||
} | } | ||
− | </syntaxhighlight> | + | </syntaxhighlight>المزيد عن [[Kotlin/functions|الدوال (functions)]]. |
− | == استدعاء عدة توابع ( | + | == استدعاء عدة توابع (Methods) عبر الكائن (Object) (باستخدام <code>with</code>) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
class Turtle { | class Turtle { | ||
− | + | fun penDown() | |
− | + | fun penUp() | |
− | + | fun turn(degrees: Double) | |
− | + | fun forward(pixels: Double) | |
− | |||
} | } | ||
− | |||
val myTurtle = Turtle() | val myTurtle = Turtle() | ||
− | |||
with(myTurtle) { //لرسم مربع بمئة بكسل | with(myTurtle) { //لرسم مربع بمئة بكسل | ||
− | + | penDown() | |
− | + | for(i in 1..4) { | |
− | + | forward(100.0) | |
− | + | turn(90.0) | |
− | + | } | |
− | + | penUp() | |
} | } | ||
سطر 227: | سطر 245: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == تجربة Java 7 مع المصادر ( | + | == تجربة Java 7 مع المصادر (Resources) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val stream = Files.newInputStream(Paths.get("/some/file.txt")) | val stream = Files.newInputStream(Paths.get("/some/file.txt")) | ||
stream.buffered().reader().use { reader -> | stream.buffered().reader().use { reader -> | ||
− | + | println(reader.readText()) | |
} | } | ||
+ | |||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == الشكل | + | == الشكل المناسب للدالة العامة (Generic) والتي تتطلب معلومات من النوع العام (Generic) == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
− | // | + | // public final class Gson { |
− | // | + | // ... |
− | // | + | // public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException { |
− | // | + | // ... |
inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java) | inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java) | ||
− | </syntaxhighlight> | + | </syntaxhighlight>المزيد عن [[Kotlin/generics|الأنواع المُعمَّمة (generics)]]. |
− | == استخدام القيم | + | == استخدام القيم المنطقية (Boolean) من النوع Nullable == |
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val b: Boolean? = ... | val b: Boolean? = ... | ||
if (b == true) { | if (b == true) { | ||
− | + | ... | |
} else { | } else { | ||
− | + | //false أو null قيمة المتحول إما | |
} | } | ||
− | </syntaxhighlight> | + | |
+ | |||
+ | </syntaxhighlight>المزيد عن [[Kotlin/null safety|استخدام القيمة null وأمانها]]. | ||
== مصادر == | == مصادر == | ||
− | * [https://kotlinlang.org/docs/reference/idioms.html | + | * [https://kotlinlang.org/docs/reference/idioms.html التعابير الاصطلاحيّة في التوثيق الرسميّ للغة Kotlin.] |
[[تصنيف:Kotlin]] | [[تصنيف:Kotlin]] | ||
[[تصنيف:Kotlin conventions]] | [[تصنيف:Kotlin conventions]] |
المراجعة الحالية بتاريخ 09:22، 15 مايو 2018
تعرِض هذه الصفحة عددًا من التعابير الاصطلاحيّة المستخدَمة بكثرةٍ في لغة Kotlin، ولأيّ اصطلاحٍ جديدٍ لم يُذكَر فيمكنك تعديل هذه الصفحة لإضافته.
إنشاء كائنات نقل البيانات DTO: Data Transfer Objects (الكائنات POJO/POCO)
ليكن الصنف (class) الآتي باسم Customer
:
data class Customer(val name: String, val email: String)
وله التوابع الوظيفيّة (functional methods) الآتية:
- توابع getter (وتوابع setter في حالة المتحولات من النوع
var
) لكافة الخاصّيّات (properties) equals()
hashCode()
toString()
copy()
component1()
وcomponent2()
...إلخ. وذلك لكافة الخاصّيّات (properties) في الصنف (راجع أصناف البيانات [data classes])
تحديد القيم الافتراضية لمعاملات الدوال (Function Parameters)
fun foo(a: Int = 0, b: String = "") { ... }
المزيد عن الدوال (functions).
ترشيح (Filter) عناصر القائمة
val positives = list.filter { x -> x > 0 }
أو بشكلٍ أكثر اختصارًا:
val positives = list.filter { it > 0 }
ملء سلسلة نصية (String Interpolation)
println("Name $name")
المزيد عن السلاسل النصيّة (strings).
التحقق من القيمة باستخدام تعبير when
when (x) {
is Foo -> ...
is Bar -> ...
else -> ...
}
المزيد عن تعبير when
.
المرور بعناصر كائن Map أو قائمة من الثنائيات (Pairs)
for ((k, v) in map) { println("$k -> $v") }
مهما كانت k أو v.
استخدام المجالات (Ranges)
for (i in 1..100) { ... } // المجال مغلق ويتضمن 100 قيمة
for (i in 1 until 100) { ... } // مجال نصف مفتوح ولا يشمل 100 قيمة
for (x in 2..10 step 2) { ... } // مجال بخطوة ثابتة بمقدار 2
for (x in 10 downTo 1) { ... } // مجال تنازلي
if (x in 1..10) { ... } // قيمة المتحول تقع ة في المجال من 1 حتى 10
المزيد عن المجالات (ranges).
قائمة القراءة فقط (Read-Only List)
val list = listOf("a", "b", "c")
كائن Map للقراءة فقط
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
الوصول إلى كائن Map
println(map["key"])
map["key"] = value
الخاصية الكسولة (Lazy Property)
val p: String by lazy {
// عمليات على السلسلة النصيّة
}
المزيد عن الخاصيّات الكسولة (lazy properties).
الدوال الإضافية (Extension Functions)
fun String.spaceToCamelCase() { ... }
"Convert this to camelcase".spaceToCamelCase()
المزيد عن الدوال الإضافيّة (extension functions).
إنشاء نمط التصميم Singleton
object Resource {
val name = "Name"
}
شيفرة if not null المختصرة
val files = File("Test").listFiles()
println(files?.size)
شيفرة if not و else المختصرة
val files = File("Test").listFiles()
println(files?.size ?: "empty")
تنفيذ التعليمة if null
val values = ...
val email = values["email"] ?: throw IllegalStateException("Email is missing!")
الحصول على العنصر الأول من مجموعة قد تكون فارغة
val emails = ... // من الممكن أن تكون فارغة
val mainEmail = emails.firstOrNull() ?: ""
المزيد عن المجموعات (collections).
تنفيذ if not null
val value = ...
value?.let {
... // سينفذ هذا الجزء إن لم تكن القيمة null
}
تعيين Map للقيم من النوع nullable إن لم تكن بقيمة null
val value = ...
val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull
المزيد عن استخدام القيمة null وأمانها.
أمر العودة (return
) في تعبير when
fun transform(color: String): Int {
return when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw
IllegalArgumentException("Invalid color param value")
}
}
المزيد عن أمر العودة (return
).
تعبير try
/catch
fun test() {
val result = try {
count()
} catch (e: ArithmeticException) {
throw IllegalStateException(e)
}
// العمل بالنتائج
}
المزيد عن الاستثناءات (exceptions).
تعبير if
fun foo(param: Int) {
val result = if (param == 1) {
"one"
} else if (param == 2) {
"two"
} else {
"three"
}
}
المزيد عن تعبير الشرط if.
استخدام الشكل البنائي (Builder-Style) للتوابع (Methods) التي تعيد النوع Unit
fun arrayOfMinusOnes(size: Int): IntArray {
return IntArray(size).apply { fill(-1) }
}
الدالة وحيدة التعبير (Single-Expression Functions)
fun theAnswer() = 42
وهذا مماثل تمامًا للشكل:
fun theAnswer(): Int {
return 42
}
وقد تُدمَج مع تعابير اصطلاحيّة أخرى بهدف الحصول على شيفرة أقصر، مثل دمجها مع تعبير when
بالشكل:
fun transform(color: String): Int = when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw
IllegalArgumentException("Invalid color param value")
}
المزيد عن الدوال (functions).
استدعاء عدة توابع (Methods) عبر الكائن (Object) (باستخدام with
)
class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) { //لرسم مربع بمئة بكسل
penDown()
for(i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
تجربة Java 7 مع المصادر (Resources)
val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
println(reader.readText())
}
الشكل المناسب للدالة العامة (Generic) والتي تتطلب معلومات من النوع العام (Generic)
// public final class Gson {
// ...
// public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
// ...
inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java)
المزيد عن الأنواع المُعمَّمة (generics).
استخدام القيم المنطقية (Boolean) من النوع Nullable
val b: Boolean? = ...
if (b == true) {
...
} else {
//false أو null قيمة المتحول إما
}
المزيد عن استخدام القيمة null وأمانها.