ใช้หลาย let-as ภายในคำสั่ง if ใน Swift


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
}

ไวยากรณ์นั้นไม่ทำงานดังนั้นฉันจึงสงสัยว่ามีวิธีที่สวยงามในการทำเช่นนั้นหรือไม่


1
เป็นไปได้ที่ซ้ำกันของการแกะตัวเลือกหลายตัวเลือกใน if statement
Jack

อาจมีวิธีใช้คำสั่ง switch เพื่อจัดรูปแบบให้ตรงกับประเภท ดูเอกสาร :
lomokat

คำตอบ:


305

อัปเดตสำหรับ Swift 3:

สิ่งต่อไปนี้จะทำงานใน Swift 3:

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

โปรดอย่าลืมว่าหากการเชื่อมโยงทางเลือกหนึ่งครั้งนั้นล้มเหลวรหัสภายในif-letบล็อกจะไม่ถูกดำเนินการ

หมายเหตุ: ส่วนคำสั่งทั้งหมดไม่จำเป็นต้องเป็นคำสั่ง 'ปล่อยให้' คุณสามารถมีการตรวจสอบบูลีนที่คั่นด้วยเครื่องหมายจุลภาค

ตัวอย่างเช่น:

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

สวิฟท์ 1.2:

Apple อาจอ่านคำถามของคุณแล้วเนื่องจากโค้ดที่หวังไว้สำหรับคุณรวบรวมได้อย่างถูกต้องใน Swift 1.2 (ในรุ่นเบต้าวันนี้):

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

Swift 1.1 และรุ่นก่อนหน้า:

นี่เป็นข่าวดีที่คุณสามารถทำได้โดยสิ้นเชิง ข้อความสั่ง switch บน tuple ของค่าทั้งสองของคุณสามารถใช้การจับคู่รูปแบบเพื่อแปลงค่าทั้งสองไป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 @AaronBratcher ทำไมไม่ไปหาคุณล่ะ?
Daniel Gomez Rico

1
ใน Swift 1.2 ตอนนี้คุณสามารถทำได้ในหนึ่งบรรทัด: stackoverflow.com/a/28418847/1698576
smithclay

ในรหัสของคุณคุณมีตัวเลือก 2 ตัวที่ไม่ได้เปิดใช้งาน มันจะใช้แบบนั้นตลอดเลยเหรอ? ฉันมีรหัสที่แตกต่างกันสับสน if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window {...}. ที่2 letยังเป็นตัวเลือกที่มีผลผูกพันหรือไม่ ฉันหมายถึงappไม่มีตัวเลือกอีกต่อไป ขวา?
ฮันนี่

1
มันคือ. appไม่เป็นตัวเลือกอีกต่อไป แต่windowคุณสมบัติของมันคือ (ประเภทเป็นUIWindow?) ดังนั้นนั่นคือสิ่งที่คุณไม่ได้เปิดใหม่
Nate Cook

7

ด้วย Swift 3 คุณสามารถใช้การผูกมัดตัวเลือกสลับคำสั่งหรือรูปแบบเพิ่มเติมเพื่อแก้ไขปัญหาของคุณ


1. การใช้if let(การผูกหรือการผูกมัดเสริม)

Swift โปรแกรมภาษารัฐเกี่ยวกับการผูกมัดตัวเลือก:

สามารถทำการสืบค้นหลาย ๆ คำพร้อมกันได้และการโยงทั้งหมดล้มเหลวอย่างงดงามหากลิงก์ใด ๆ ในกลุ่มนั้นเป็นศูนย์

ดังนั้นในกรณีที่ง่ายที่สุดคุณสามารถใช้รูปแบบต่อไปนี้เพื่อใช้หลายแบบสอบถามในการดำเนินการผูกมัดตัวเลือกของคุณ:

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 และการโยงค่าในคำสั่ง switch

เป็นทางเลือกแทนการโยงแบบง่าย ๆ คำสั่ง switchสามารถเสนอโซลูชันแบบละเอียดเมื่อใช้กับสิ่งอันดับและการโยงค่า

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

3. การใช้สิ่งอันดับif case(รูปแบบตัวเลือก)

if case( รูปแบบตัวเลือก ) ให้วิธีที่สะดวกในการคลายค่าของตัวเลือกการแจงนับ คุณสามารถใช้มันร่วมกับ tuples เพื่อที่จะทำการผูกมัดตัวเลือกที่มีหลายคำสั่ง:

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

Swift 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.