কোটলিনে যদি বিবৃতি দেওয়া যায় তবে সুইফ্ট


123

কোটলিনে নীচে সুইফট কোডের সমতুল্য আছে?

if let a = b.val {

}
else {

}

উত্তর:


255

আপনি letএই জাতীয়- ফাংশন ব্যবহার করতে পারেন :

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শূন্য না হলে মূল্যায়ন করা হবে ।


40
এটা সমতুল্য নয়। aভিতরে অ্যাক্সেস letএবং runব্লক করা যাবে না ।
জ্যাকি চই

6
aএখনো সুযোগ ভিতরে সংজ্ঞায়িত করা হয় না letএবং run। তবে আপনি অন্তর্নিহিত প্যারামিটার দিয়ে bঅভ্যন্তরের মানটি অ্যাক্সেস করতে পারেন । আমার ধারণা অনুযায়ী এটি একই উদ্দেশ্যে কাজ করে। letit
marstran

1
এই aব্লক কোডের আগে সুইফ্ট কোডটি অ্যাসাইনমেন্টটি সম্পূর্ণ করে । এবং aভিতরে প্রবেশ করা যেতে পারে।
জ্যাকি চোই

1
এটি কী বরাদ্দ করে a? তাহলে এটা b, তারপর itসঠিক একই উদ্দেশ্য করে তোলে। এটি -ব্লক-এর aফলাফলের সাথে পুনরায় সাইন করে val?
marstran

3
আপনি কেবলমাত্র ব্লকের itমধ্যে থেকে অ্যাক্সেস করতে পারবেন letletবা runব্লকের ফলাফল নির্ধারিত হবে a। ফলাফলটি ব্লকের সর্বশেষ প্রকাশ। আপনি অন্য কোনও সাধারণ অ্যাসাইনমেন্টের সাথে ঠিক যেমনভাবে কাজটি শেষ / শেষ করার পরে ব্যবহার করেন let/ run
marstran

51

আসুন প্রথমে নিশ্চিত করা যাক আমরা সরবরাহিত সুইফট আইডিয়ামের শব্দার্থক শব্দগুলি বুঝতে পারি:

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

এর অর্থ এটি: "যদি <expr>ফলাফলটি একটি thenশূন্যস্থানবিহীন in চ্ছিক হয় তবে আন - র্যাপড মানটির সাথে aআবদ্ধ প্রতীকটি দিয়ে -ব্লকটি প্রবেশ করান Otherwise অন্যথায় 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

সুইফ্টের বিপরীতে, কোটলিনে এটি ব্যবহার করার আগে এটি alচ্ছিকভাবে মোড়ানো দরকার নয়। আমরা কেবল মানটি নাল নয় কিনা তা যাচাই করতে পারি এবং সংকলকটি আপনার সম্পাদিত চেক সম্পর্কিত তথ্য ট্র্যাক করে এবং এটি মোড়ক হিসাবে ব্যবহার করার অনুমতি দেয়।

সুইফটে:

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

}

কোটলিনে:

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

}

পড়ুন ডকুমেন্টেশন: (নাল-নিরাপত্তা) বেশি ব্যবহারের ক্ষেত্রে জন্য


এটি কেবলমাত্র কার্যকর হয় যদি বি স্থানীয় পরিবর্তনশীল হয়। ক্লাস ভেরিয়েবলের কী হবে?
ওয়ারপজিট

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  */

Kotlin এর অনুরূপ প্রভাব এর সুইফট এরguard-let বক্তব্যটির :

সুইট-এর বিপরীতে, কোটলিনে, কোনও গার্ড বিবৃতি নেই is তবে, আপনি একই ব্যবহার করতে 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"
}

যদি নাম == নল কোডটি ull code এ কার্যকর করা হয় না, যদি স্ট্রিং - কোড এক্সিকিউট হিসাবে নাম হয়: nameUnwrapp == নাম।
20 Яковенко

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()
}

আপনি একাধিক nallable মান নির্ধারণ করতে পারেন

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(A.isNull()){
// A is null
    }else{
// A is not null
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.