সুইফটে যদি একটি আই-স্টেটমেন্টের মধ্যে একাধিক লে-অ্যাস ব্যবহার করা হয়


144

আমি একটি অভিধান থেকে দুটি মান আন-র্যাপ করছি এবং সেগুলি ব্যবহার করার আগে আমাকে সেগুলি কাস্ট করতে হবে এবং সঠিক ধরণের জন্য পরীক্ষা করতে হবে। এটিই আমি নিয়ে এসেছি:

var latitude : AnyObject! = imageDictionary["latitude"]
var longitude : AnyObject! = imageDictionary["longitude"]

if let latitudeDouble = latitude as? Double  {
   if let longitudeDouble = longitude as? Double {
       // do stuff here
   }
}

তবে আমি দুটি জিজ্ঞাসা করতে চাই যদি প্রশ্নগুলি এক হয়ে যায়। যাতে এটি এমন কিছু হয়:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
    // do stuff here
}

এই বাক্য গঠনটি কাজ করছে না, তাই আমি ভাবছিলাম যে এটি করার কোনও সুন্দর উপায় আছে কিনা।



ধরণগুলির সাথে মেলে প্যাটার্নে সুইচ স্টেটমেন্ট ব্যবহার করার কোনও উপায় থাকতে পারে। দস্তাবেজগুলিতে একবার দেখুন :
লোমোকেট

উত্তর:


305

সুইফট 3 এর জন্য আপডেট:

নিম্নলিখিতটি সুইফট 3 এ কাজ করবে:

if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
    // latitudeDouble and longitudeDouble are non-optional in here
}

কেবল মনে রাখতে ভুলবেন না যে চেষ্টা করা alচ্ছিক বাইন্ডিংগুলির মধ্যে একটি যদি ব্যর্থ হয় তবে if-letব্লকের ভিতরে কোডটি কার্যকর করা হবে না।

দ্রষ্টব্য: ধারাগুলি সকলকে 'লেট' ধারা থাকতে হবে না, আপনি যে কোনও সিরিজ বুলিয়ান চেক কমা দ্বারা পৃথক করতে পারেন।

উদাহরণ স্বরূপ:

if let latitudeDouble = latitude as? Double, importantThing == true {
    // latitudeDouble is non-optional in here and importantThing is true
}

সুইফট 1.2:

অ্যাপল আপনার প্রশ্নটি পড়ে থাকতে পারে, কারণ আপনার প্রত্যাশিত কোডটি সুইফট ১.২ (আজ বিটাতে) সঠিকভাবে সংকলন করেছে:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
    // do stuff here
}

সুইফট 1.1 এবং আগের:

এখানে সুসংবাদ - আপনি এটি পুরোপুরি এটি করতে পারেন। আপনার দুটি মানের একটি দ্বিগুণ উপর একটি স্যুইচ বিবৃতি উভয় Doubleএকই সময়ে কাস্ট করতে প্যাটার্ন-ম্যাচিং ব্যবহার করতে পারে :

var latitude: Any! = imageDictionary["latitude"]
var longitude: Any! = imageDictionary["longitude"]

switch (latitude, longitude) {
case let (lat as Double, long as Double):
    println("lat: \(lat), long: \(long)")
default:
    println("Couldn't understand latitude or longitude as Double")
}

আপডেট: কোডটির এই সংস্করণটি এখন সঠিকভাবে কাজ করে।


এটি আমার পক্ষে 6.1.1 এ কাজ করে, @ অ্যারন ব্র্যাচার আপনার কাছে কেন নয়?
ড্যানিয়েল গোমেজ রিকো

1
সুইফট 1.2, এটি এখন এক লাইন এই কাজটি করা সম্ভব: stackoverflow.com/a/28418847/1698576
smithclay

আপনার কোডে আপনার 2 টি বিকল্প মোড়কানো রয়েছে। এটি কি সর্বদা এর মতো ব্যবহার করা যায়? আমার বিভ্রান্তিকর কোড রয়েছে। if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window {...}। কি 2nd let এছাড়াও ঐচ্ছিক বাঁধাই? মানে appএখন আর longerচ্ছিক নয়। ঠিক আছে?
মধু

1
এইটা. appআর anচ্ছিক নয়, তবে এর windowসম্পত্তি (এটির ধরণ UIWindow?), সুতরাং এটিই আপনি মোড়কে যাচ্ছেন।
নেট কুক

7

সুইফট 3 এর সাহায্যে আপনি আপনার সমস্যা সমাধানের জন্য alচ্ছিক চেইনিং, স্যুইচ স্টেটমেন্ট বা alচ্ছিক প্যাটার্ন ব্যবহার করতে পারেন।


1. ব্যবহার if let(alচ্ছিক বাঁধাই / chaচ্ছিক শৃঙ্খলা)

সুইফট প্রোগ্রামিং ভাষা ঐচ্ছিক chaining সম্পর্কে বলে:

একাধিক ক্যুরিয়াস একসাথে বেঁধে রাখা যেতে পারে, এবং যদি চেইনের কোনও লিঙ্ক শূন্য থাকে তবে পুরো শৃঙ্খলা কৃপণভাবে ব্যর্থ হয়।

অতএব, সহজতম ক্ষেত্রে, আপনি আপনার alচ্ছিক চেইন ক্রিয়াকলাপে একাধিক প্রশ্নের ব্যবহার করতে নিম্নলিখিত প্যাটার্নটি ব্যবহার করতে পারেন:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if let latitude = latitude as? Double, let longitude = longitude as? Double {
    print(latitude, longitude)
}

// prints: 2.0 10.0

2. একটি সুইচ বিবৃতিতে tuples এবং মান আবদ্ধ ব্যবহার

একটি সাধারণ alচ্ছিক শৃঙ্খলার বিকল্প হিসাবে, স্যুইচ স্টেটমেন্ট টিউপস এবং মান বন্ধনের সাথে ব্যবহার করার সময় একটি জরিমানা দানাযুক্ত সমাধান দিতে পারে:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude, longitude) {
case let (Optional.some(latitude as Double), Optional.some(longitude as Double)):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude, longitude) {
case let (latitude as Double, longitude as Double):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude as? Double, longitude as? Double) {
case let (.some(latitude), .some(longitude)):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude as? Double, longitude as? Double) {
case let (latitude?, longitude?):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0

৩. if case( alচ্ছিক প্যাটার্ন) সহ টিপলগুলি ব্যবহার করে

if case( patternচ্ছিক প্যাটার্ন ) alচ্ছিক গণনার মানগুলি মোড়কে দেওয়ার জন্য একটি সুবিধাজনক উপায় সরবরাহ করে। একাধিক প্রশ্নের সাথে কিছু optionচ্ছিক শৃঙ্খলা সম্পাদনের জন্য আপনি এটি টিপলস সহ ব্যবহার করতে পারেন:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (.some(latitude as Double), .some(longitude as Double)) = (latitude, longitude) {
    print(latitude, longitude)
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (latitude as Double, longitude as Double) = (latitude, longitude) {
    print(latitude, longitude)
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (.some(latitude), .some(longitude)) = (latitude as? Double, longitude as? Double) {
    print(latitude, longitude)
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (latitude?, longitude?) = (latitude as? Double, longitude as? Double) {
    print(latitude, longitude)
}

// prints: 2.0 10.0

5

সুইফট 3.0

if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
    // do stuff here
}

4
আপনার গৃহীত উত্তরের একটি সম্পাদনার পরামর্শ দেওয়া উচিত, অন্য নিম্ন মানের উত্তর যুক্ত করবেন না।
jervine10
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.