स्विफ्ट यदि कोटलिन में बयान दें


123

कोटलिन में नीचे स्विफ्ट कोड के बराबर है?

if let a = b.val {

}
else {

}

जवाबों:


255

आप letइस तरह -function का उपयोग कर सकते हैं :

val a = b?.let {
    // If b is not null.
} ?: run {
    // If b is null.
}

ध्यान दें कि आपको runफ़ंक्शन को कॉल करने की आवश्यकता है यदि आपको कोड के ब्लॉक की आवश्यकता है। runयदि आप एल्विस-ऑपरेटर ( ?:) के बाद केवल ऑनलाइनर रखते हैं, तो आप -ब्लॉक को हटा सकते हैं ।

विदित हो कि runब्लॉक का मूल्यांकन या तो bशून्य है, या यदि let-ब्लॉक का मूल्यांकन होता है null

इस वजह से, आप आमतौर पर सिर्फ एक ifअभिव्यक्ति चाहते हैं ।

val a = if (b == null) {
    // ...
} else {
    // ...
}

इस स्थिति में, else-ब्लॉक का केवल तभी मूल्यांकन किया जाएगा जब bवह अशक्त न हो।


41
यह बराबर नहीं है। aअंदर letऔर runब्लॉक नहीं किया जा सकता है ।
जैकी चोई

6
aअभी तक के दायरे के अंदर से परिभाषित नहीं है letऔर run। लेकिन आप अंतर्निहित पैरामीटर bके letसाथ अंदर के मूल्य तक पहुंच सकते हैं it। यह वही उद्देश्य है जो मुझे लगता है।
marstran

1
कोड के aउन ब्लॉक से पहले स्विफ्ट कोड असाइनमेंट पूरा करता है । और aअंदर पहुँचा जा सकता है।
जैकी चोई

1
यह किसको असाइन करता है a? यदि यह है b, तो itठीक उसी उद्देश्य को पूरा करता है। क्या यह -ब्लॉक aके परिणाम के साथ पुन: valसंकेत देता है?
28

3
आप केवल itभीतर से ही पहुंच सकते हैंlet ब्लॉक के । letया runब्लॉक के परिणाम को सौंपा जाएगा a। परिणाम ब्लॉक में अंतिम अभिव्यक्ति है। आप असाइनमेंट का उपयोग / समाप्त करने के बाद करते हैं , जैसे आप किसी अन्य सामान्य असाइनमेंट के साथ करते हैं। letrun
marstran

51

आइए पहले यह सुनिश्चित करें कि हम उपलब्ध स्विफ्ट मुहावरे के शब्दार्थ को समझें:

if let a = <expr> {
     // then-block
}
else {
     // else-block
}

इसका मतलब यह है: "यदि <expr>एक गैर-शून्य वैकल्पिक में परिणाम, thenअपरिवर्तित aमूल्य के लिए बाध्य प्रतीक के साथ -ब्लॉक दर्ज करें । अन्यथा elseब्लॉक में प्रवेश करें ।

विशेष रूप से ध्यान दें कि केवल -ब्लॉक के भीतरa ही बाध्य है । कोटलिन में आप इसे आसानी से कॉल करके प्राप्त कर सकते हैंthen

<expr>?.also { a ->
    // then-block
}

और आप elseइस तरह एक -ब्लॉक जोड़ सकते हैं :

<expr>?.also { a ->
    // then-block
} ?: run {
    // else-block
}

यह स्विफ्ट मुहावरे के समान शब्दार्थ में परिणाम करता है।


11

मेरा जवाब दूसरों से पूरी तरह से एक कॉपी कैट है। हालाँकि, मैं उनकी अभिव्यक्ति को आसानी से नहीं समझ सकता। इसलिए मुझे लगता है कि एक और समझने योग्य उत्तर प्रदान करना अच्छा होगा।

स्विफ्ट में:

if let a = b.val {
  //use "a" as unwrapped
}
else {

}

कोटलिन में:

b.val?.let{a -> 
  //use "a" as unwrapped
} ?: run{
  //else case
}

letइसके बजाय उपयोग करने का alsoमतलब है कि runब्लॉक जब भी letब्लॉक लौटेगा null, जो हम चाहते हैं वह नहीं है।
मार्को टोपोलनिक

6

स्विफ्ट के विपरीत, इसके कोटलिन में उपयोग करने से पहले वैकल्पिक को खोलना आवश्यक नहीं है। हम केवल जाँच सकते हैं कि क्या मूल्य अशक्त है और संकलक आपके द्वारा किए गए चेक के बारे में जानकारी को ट्रैक करता है और इसे अपरिवर्तित रूप से उपयोग करने की अनुमति देता है।

स्विफ्ट में:

if let a = b.val {
  //use "a" as unwrapped
} else {

}

कोटलिन में:

if b.val != null {
  //use "b.val" as unwrapped
} else {

}

प्रलेखन का संदर्भ लें : (अशक्त-सुरक्षा) ऐसे अधिक उपयोग के मामलों के लिए


यह केवल तभी काम करता है यदि b एक स्थानीय चर है। वर्ग चर के बारे में क्या?
वारपिज़िट

5

if let बयान।

स्विफ्ट के Optional Binding(तथाकथित if-letकथन) का उपयोग यह पता लगाने के लिए किया जाता है कि क्या एक वैकल्पिक में एक मूल्य होता है, और यदि ऐसा है, तो उस मूल्य को अस्थायी स्थिर या चर के रूप में उपलब्ध कराने के लिए। तो, बयान के Optional Bindingलिए एक if-letइस प्रकार है:

स्विफ्ट का if-letबयान:

let b: Int? = 50

if let a = b {
    print("Good news!")
} else {
    print("Equal to 'nil' or not set")
}

/*  RESULT: Good news!  */

कोटलिन में, स्विफ्ट की तरह, जब यह अपेक्षित नहीं है, तो एक शून्य मान तक पहुंचने की कोशिश करने से होने वाली दुर्घटनाओं से बचने के लिए, एक विशिष्ट वाक्यविन्यास (जैसे b.let { }दूसरे उदाहरण में) ठीक से अलंकृत करने के लिए प्रदान किया जाता है nullable types:

स्विफ्ट के if-letबयान के समकक्ष कोटलिन 1 :

val b: Int? = null
val a = b

if (a != null) { 
    println("Good news!")
} else { 
    println("Equal to 'null' or not set")
}

/*  RESULT: Equal to 'null' or not set  */

कोटलिन का letफ़ंक्शन, जब सुरक्षित-कॉल ऑपरेटर के साथ संयोजन में उपयोग किया जाता है ?:, अशक्त भावों को संभालने के लिए एक संक्षिप्त तरीका प्रदान करता है।

स्विफ्ट के बयान के कोटलिन समकक्ष 2 (इनलाइन लेट फंक्शन और एल्विस ऑपरेटर)if-let :

val b: Int? = null

val a = b.let { nonNullable -> nonNullable } ?: "Equal to 'null' or not set"
println(a)

/*  RESULT: Equal to 'null' or not set  */

यहां छवि विवरण दर्ज करें

guard let बयान।

guard-letस्विफ्ट में बयान सरल और शक्तिशाली है। यह कुछ स्थिति की जांच करता है और यदि यह गलत होने का मूल्यांकन करता है, तो elseकथन निष्पादित होता है जो सामान्य रूप से एक विधि से बाहर निकल जाएगा।

आइए एक स्विफ्ट के guard-letविवरण का अन्वेषण करें :

let b: Int? = nil

func testIt() {
    guard let a = b else {
        print("Equal to 'nil' or not set")
        return
    }
    print("Good news!")
}
testIt()

/*  RESULT: Equal to 'nil' or not set  */

स्विफ्ट के guard-letबयान का कोटलिन का समान प्रभाव :

स्विफ्ट के विपरीत, कोटलिन में, कोई गार्ड स्टेटमेंट नहीं है । हालांकि, आप एक समान प्रभाव प्राप्त करने के लिए Elvis Operator- का उपयोग कर सकते हैं ?:

val b: Int? = 50

fun testIt() {
    val a = b ?: return println("Equal to 'null' or not set")
    return println("Good news!")
}
testIt()

/*  RESULT: Good news!  */

उम्मीद है की यह मदद करेगा।


4

यहां बताया गया है कि जब nameशून्य न हो तो केवल कोड निष्पादित कैसे करें :

var name: String? = null
name?.let { nameUnwrapp ->
    println(nameUnwrapp)  // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
    println(nameUnwrapp)  // printed "Alex"
}

if name == null code in {} निष्पादित नहीं करते हैं, यदि नाम String - code execute: nameUnwrapp = - नाम है।
Александр Яковенко

1
मुझे नहीं लगता कि यह वही है जो ओपी पूछ रहा है, मुझे यकीन है कि ओपी पहले से ही जानता है कि क्या letकरता है, लेकिन सवाल उस elseरणनीति के बारे में है जो उस वस्तु को निष्पादित करता है जिस letपर कहा जाता है null। स्विफ्ट में यह अधिक प्राकृतिक (तर्कपूर्ण) तरीके से है। लेकिन कोटलिन और स्विफ्ट दोनों को बहुत कुछ करने के बाद, मुझे लगता है कि कोटलिन के पास स्विफ्ट की तरह एक सरल अलौकिकपन था।
kalehv

2

यहाँ मेरा वैरिएंट, बहुत ही सामान्य तक सीमित है "यदि अशक्त नहीं" मामला।

सबसे पहले, इसे कहीं परिभाषित करें:

inline fun <T> ifNotNull(obj: T?, block: (T) -> Unit) {
    if (obj != null) {
        block(obj)
    }
}

यह संभवतः होना चाहिए internal, संघर्षों से बचने के लिए।

अब, इस स्विफ्ट कोड को परिवर्तित करें:

if let item = obj.item {
    doSomething(item)
}

इस कोटलिन कोड के लिए:

ifNotNull(obj.item) { item -> 
    doSomething(item)
}

ध्यान दें कि हमेशा कोटलिन में ब्लॉक के साथ, आप तर्क को छोड़ सकते हैं और उपयोग कर सकते हैं it:

ifNotNull(obj.item) {
    doSomething(it)
}

लेकिन अगर ब्लॉक 1-2 लाइनों से अधिक है, तो यह स्पष्ट होना सबसे अच्छा है।

यह स्विफ्ट के समान है जैसा कि मैं पा सकता हूं।


0

अगर-लेट में स्विफ्ट की शैली को प्राप्त करने के लिए कोटलिन में एक समान तरीका है

if (val a = b) {
    a.doFirst()
    a.doSecond()
}

आप कई अशक्त मूल्यों को भी असाइन कर सकते हैं

if (val name = nullableName, val age = nullableAge) {
    doSomething(name, age)
}

यदि 1 से अधिक बार अशक्त मानों का उपयोग किया जाता है तो इस तरह का दृष्टिकोण अधिक उपयुक्त होगा। मेरी राय में, यह प्रदर्शन पहलू से मदद करता है क्योंकि अशक्त मूल्य केवल एक बार जांचा जाएगा।

स्रोत: कोटलिन चर्चा


1
कृपया ध्यान रखें कि जो दृष्टिकोण आप दिखा रहे हैं वह वर्तमान में संकलित नहीं है। इस मुद्दे से निपटने के लिए कोटलिन भाषा को कैसे बदला जाए, यह केवल एक सुझाव है। इसलिए, यह एक वैध समाधान नहीं है।
पीटर एफ

0

मैं इस उत्तर को स्वीकृत उत्तर को स्पष्ट करने के लिए जोड़ रहा हूँ क्योंकि यह एक टिप्पणी के लिए बहुत बड़ा है।

यहाँ सामान्य पैटर्न यह है कि आप एल्विस ऑपरेटर द्वारा अलग किए गए कोटलिन में उपलब्ध स्कोप फ़ंक्शंस के किसी भी संयोजन का उपयोग कर सकते हैं :

<nullable>?.<scope function> {
    // code if not null
} :? <scope function> {
    // code if null
}

उदाहरण के लिए:

val gradedStudent = student?.apply {
    grade = newGrade
} :? with(newGrade) {
    Student().apply { grade = newGrade }
}

-1

मेरी राय में सबसे साफ विकल्प यह है

स्विफ्ट:

if let a = b.val {

} else {

}

Kotlin

b.val.also { a ->

} ?: run {

}

-1

स्विफ्ट यदि कोटलिन में बयान दें

संक्षिप्त उत्तर सरल IF-ELSE का उपयोग करना है क्योंकि इस टिप्पणी के समय तक कोटलीन LET में कोई समकक्ष नहीं है,

    if(A.isNull()){
// A is null
    }else{
// A is not null
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.