แผนที่, CompactMap และ FlatMap ใน Swift

ใช้อย่างไรและเมื่อไหร่

ที่มา: Undraw

ในแอปทั่วไป เป็นเรื่องปกติมากที่จะทำงานกับอาร์เรย์ บ่อยครั้งเราจำเป็นต้องนำองค์ประกอบทั้งหมดมาใช้ทีละรายการแล้วปรับใช้การเปลี่ยนแปลงกับองค์ประกอบเหล่านั้น

มันเกิดขึ้นบ่อยมาก และฉันเห็นนักพัฒนารุ่นเยาว์หรือระดับกลางจำนวนมากทำงานนี้โดยใช้การวนซ้ำแบบคลาสสิก โดยforEachไม่รู้ว่ามีฟังก์ชันที่ดีกว่าในการแก้ปัญหานี้ในFoundationเฟรมเวิร์ก

แผนที่

แผนที่เป็นฟังก์ชัน Swift มาตรฐานที่ใช้กับคอลเลกชั่น ซึ่งจะป้อนข้อมูลเพื่อปิดทุกองค์ประกอบและส่งคืนคอลเลกชั่นที่แตกต่างกัน กล่าวอีกนัยหนึ่ง คุณมีอาร์เรย์เริ่มต้น คุณนำองค์ประกอบทั้งหมดของอาร์เรย์มาทีละรายการ นำไปใช้กับทุกๆ การเปลี่ยนแปลงที่ควบคุมโดยการปิดของคุณ และผนวกค่าผลลัพธ์ในอาร์เรย์ใหม่

โอเค มาทำตัวอย่างกัน สมมติว่าเราต้องการสร้างเกมที่ผู้เล่นจะได้รับแอนนาแกรมของชื่อฮีโร่ของ Marvel และเขา/เธอต้องเดาตัวละครที่ถูกต้อง เรามีรายชื่อและเราต้องใช้ขั้นตอนต่อไปกับทุกรายการของรายการ:

  1. เปลี่ยนชื่อเป็นตัวพิมพ์เล็ก
  2. ลบช่องว่าง
  3. สลับตัวอักษร

การใช้mapแทนทุกอย่างนั้นง่ายมากและอ่านง่าย มันเหมือนกับเวทมนตร์!

อย่างที่คุณเห็นว่ามันอ่านง่ายมากๆ แม้ว่าคุณจะไม่รู้ขั้นตอนทั้งหมดที่เกี่ยวข้องก็ตาม

CompactMap

CompactMapทำงานคล้ายกับแผนที่แต่มีโบนัส... มันจะลบทุกnilองค์ประกอบที่ได้รับจากการแปลงร่าง

มาดูตัวอย่างด่วน:

อย่างที่คุณเห็น อิโมติคอนไม่สามารถสร้าง URL ที่ถูกต้องได้ การใช้compactMapคุณสามารถกรองได้โดยไม่มีปัญหาหรือการตรวจสอบอื่น ๆ

CompactMapยังเป็นวิธีที่ยอดเยี่ยมในการกรองรายการเพื่อลบnilค่า ใดๆ เมื่อเร็ว ๆ นี้ฉันกำลังทำงานกับแอพที่ป้ายกำกับทั้งหมดของ UI ของตัวควบคุมมุมมองเดียวถูกปกครองโดยข้อมูลที่ส่งโดยเซิร์ฟเวอร์ หากมีค่าอยู่ที่นั่น คุณต้องแสดงป้ายกำกับ หากไม่มี ป้ายกำกับจะถูกซ่อนโดยไม่เว้นว่างไว้

ทุกอย่างเป็นไดนามิกใน a UITableViewดังนั้นฉันจึงจำเป็นต้องเพิ่มรายการหรือไม่ใน datsource (หากคุณสนใจเทคนิคส่วนตัวของฉันในการจัดการกับแหล่งข้อมูลและส่วนต่างๆให้ดูที่บทความนี้ )

การกรองทุกอย่างด้วยcompactMapความเร็วสูงและอ่านง่ายมาก แน่นอนว่าบางสิ่งเช่นนี้ในแอปซับซ้อนกว่าเล็กน้อย:

โปรดสังเกตสิ่งหนึ่งในตัวอย่างล่าสุด อาร์เรย์ฟิลด์เป็นประเภท[String?]ในขณะที่อาร์เรย์รายการเป็นประเภท[String]ดังนั้นประเภทที่ส่งคืนcompactMapจะไม่เป็นoptional. ว้าว น่าทึ่ง!

FlatMap

แผนที่ประเภทสุดท้ายคือฟังก์ชันที่ทำให้อาร์เรย์ของอาร์เรย์เรียบตามชื่อ มันเพียงเปลี่ยนชุดของอาร์เรย์เป็นชุดเดียวในครั้งเดียว บางอย่างเช่นนี้:

[[1, 1, 1], [2, 2, 2], [3, 3, 3]] -> [1, 1, 1, 2, 2, 2, 3, 3, 3]

คุณกำลังเขียนโค้ดหนึ่งในเกมเหล่านั้นด้วยทีมฮีโร่ต่อสู้ ทีมของคุณมีกลุ่มตัวละครและคุณเป็นผู้ตัดสินใจว่าใครจะต่อสู้ในแต่ละเกม

ในทุก ๆ รอบ จำนวนศัตรูที่พ่ายแพ้จะถูกเพิ่มเข้าไปในสถิติของฮีโร่ที่กำลังเล่นอยู่ ตอนนี้คุณต้องคำนวณจำนวนเฉลี่ยของศัตรูที่พ่ายแพ้ต่อรอบในทีมของคุณ ดังนั้นโดยพื้นฐานแล้ว คุณต้องสร้างอาร์เรย์ชุดเดียวของสถิติทั้งหมดของฮีโร่ทั้งหมด และหาค่าเฉลี่ย

มาดูโค้ดกัน:

เวทมนตร์ทั้งหมดเสร็จสิ้นที่บรรทัดที่ 25 โปรดทราบว่าฉันได้ใช้ส่วนขยายเพื่อคำนวณค่าเฉลี่ย ( บรรทัดที่ 26 ) แทนvDSP.meanฟังก์ชัน ( ลิงก์ที่นี่ ) ของAccelerateเฟรมเวิร์ก เพื่อรักษารูปแบบการเขียนโปรแกรมที่ใช้งานได้ดี

อีกหนึ่งสิ่ง

หากคุณอ่านอย่างถี่ถ้วนในตอนต้นของบทความ คุณอาจสังเกตเห็นว่าฉันเขียนเกี่ยวกับคอลเล็กชันแทนที่จะเป็นอาร์เรย์ธรรมดา คุณรู้ไหมว่าทำไม? เพราะฟังก์ชั่นแผนที่สามารถนำไปใช้กับพจนานุกรมได้เช่นกัน! วิธีการใช้ฟังก์ชันเหล่านั้นกับพจนานุกรมต้องใช้ความระมัดระวังเป็นพิเศษ:

ดังที่คุณเห็นจากตัวอย่าง พจนานุกรมต้นฉบับถูกแบ่งออกเป็นอาร์เรย์ของพจนานุกรม ตอนนี้ คุณอาจต้องการใช้การแปลงเฉพาะกับค่าของพจนานุกรม ไม่ใช่กับคีย์

แล้วคุณรู้อะไรไหม? Swift มีชุดแผนที่สำหรับทั้งสามรุ่นก่อนหน้านี้เพื่อทำงานนี้ให้สำเร็จ! เพียงใช้mapValuesเวอร์ชัน:

อย่างที่คุณเห็นผลลัพธ์เป็น a [String: String]และไม่[[String: String]]เหมือนตัวอย่างก่อนหน้านี้

มีความสุขในการเข้ารหัส Swift!

Suggested posts

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

ตัดตอนมาจาก Small, Sharp Software Tools โดย Brian P. Hogan

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

เมื่อคุณส่งคำขอไปที่ facebook.com คอมพิวเตอร์ของคุณจะค้นหาชื่อโดเมนเพื่อแปลชื่อโดเมนนั้นเป็นที่อยู่ IP เพื่อให้คอมพิวเตอร์ของคุณสามารถเชื่อมต่อได้

“เกาะเล็กๆ แห่งนั้นเปลี่ยนแปลงทุกสิ่ง”

วิธีที่เราออกแบบ Lyft Live Activities เพื่อยกระดับประสบการณ์ผู้ขับขี่

“เกาะเล็กๆ แห่งนั้นเปลี่ยนแปลงทุกสิ่ง”

ผู้เปลี่ยนเกมสำหรับรถร่วมโดยสาร จากทุกสิ่งที่เราทำที่ Lyft การออกแบบท่าเต้นของรถปิคอัพระหว่างผู้ขับขี่และผู้ขับขี่เป็นหนึ่งในสิ่งที่ซับซ้อนและเป็นผลสืบเนื่องมากที่สุด การออกแบบท่าเต้นนี้ขึ้นอยู่กับ Lyft ที่ทำหลายสิ่งหลายอย่างได้ดี แต่การรักษาผู้ขับขี่ให้ทันความเร็วเป็นสิ่งสำคัญ

Related posts

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

สวัสดีชาวไซเบอร์! ยินดีต้อนรับกลับสู่ OSINT สำหรับซีรี่ส์การล่าภัยคุกคาม ในบทความแรก ฉันได้ให้ภาพรวมของ OSINT และความสำคัญในการตามล่าภัยคุกคาม

บทสนทนาอันตราย

บทสนทนาอันตราย

หากเราต้องการจะเติบโตบนโลกใบนี้ต่อไป เราจะต้องสนทนาที่อันตราย คนที่ท้าทายสิ่งที่เราทำ สิ่งที่เรากำลังทำ และสิ่งที่เรากำลังจะทำต่อไป (หรือกำลังวางแผนที่จะทำ)

คาวบอยโกหก

บรรษัทขนาดใหญ่ขายคนอเมริกันด้วยความเท็จได้อย่างไร

คาวบอยโกหก

เช้าวันนี้เป็นสีทองอร่ามบนเนินเขาทางทิศตะวันตก เมื่อแสงแรกของแสงแดดส่องให้เห็นหญ้าที่ปกคลุมด้วยน้ำค้างแข็งบนที่ราบ ฝูงวัวแองกัสที่สงบนิ่ง ตัวสีดำสนิทและตัวมหึมา มีเงาสะท้อนยามพระอาทิตย์ขึ้นขณะที่พวกมันเดินไปตามทางที่ไม่ค่อยมีใครรู้จักไปยังสถานที่ที่พวกเขารู้จักดี บาร์อาหารเช้า

วารสาร Outvert

วารสาร Outvert

เปิดไดอารี่: รูปภาพต่อวัน ฉันเคยหลงใหลในเรื่องราวต่างๆ