December 23, 2015

รีวิว Apple Watch จากการใช้งานจริง คนแบบไหน ไลฟ์สไตล์แบบไหนจึงเหมาะกับ Apple Watch


ที่มา: http://news.iapplefan.com

เท่าที่คุยกับแฟน Apple หลายคน พบว่าแทบทุกคนยังลังเลอยู่ว่าจะซื้อ Apple Watch มาใช้ดีไหม แม้แต่ตัวผมเองก็ยังลังเล อาจเพราะ Apple เปิดตัวสินค้าได้ไม่น่าสนใจ และไม่รู้ว่าจะมีมันไปทำไม

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

รีวิวนี้ เขียนโดยอิงจากไลฟ์สไตล์ และจริตส่วนตัวของผมโดยเฉพาะ ไม่ได้เปรียบเทียบกับยี่ห้ออื่น หรือความต้องการ ความชอบของคนอื่น ดังนั้นหากอ่านแล้วพบว่า มันไม่ใช่อย่างที่ผมรีวิวไว้ก็ไม่ใช่เรื่องแปลกอะไรครับ :)

September 18, 2015

Swift: Enums กับ Associated Values

ใน Objective-C เราสามารถอ้างถึงค่าของสมาชิกใน enum ได้ ซึ่งเราจะได้ integer กลับมา แต่ว่าด้วยฟีเจอร์ associated value ของ Enum ใน Swift นั้นทำให้เราสามารถกำหนดค่าที่ต่างชนิดกันได้ให้กับสมาชิกใน enum เช่น สมาชิกใน enum ตัวหนึ่งอาจเก็บค่าชนิด Integer ส่วนอันหนึ่งเก็บค่าชนิด String  และอีกอย่างหนึ่งก็คือค่าของสมาชิกใน enum ที่ประกาศเป็น associated value จะถูกกำหนดให้ตอนที่ค่าของ enum ถูกสร้างขึ้นมา ไม่ใช่ตอนประกาศ เพราะตอนประกาศเราจะประกาศแค่ชื่อ และชนิดข้อมูลที่เก็บเท่านั้น ส่วนตัวอย่างที่หลายที่มักหยิบยกมากัน ก็คือการนำไปใช้กับรูปแบบโค้ดที่ต้อง return ค่ากลับออกมาต่างชนิดกันนั่นเอง

ยกตัวอย่างโค้ดการทำงานของบัญชีธนาคาร ที่มีจำนวนเงินเก็บไว้จำนวนหนึ่ง และมี method ที่ใช้สำหรับถอนเงินออกมา โดยที่ ถ้าจำนวนเงินที่ต้องการถอนมีจำนวนมากกว่าเงินที่เก็บไว้ ก็จะ return error message string ออกมา แต่ถ้าหากจำนวนเงินสามารถถอนออกมาได้จริง ก็จะ return จำนวนเงินคงเหลือออกมา

ถึงตรงนี้เราจะพบว่าค่าที่ถูก return กลับออกมานั้นมี type ที่แตกต่างกัน อันหนึ่งเป็น String และอีกอันหนึ่งเป็น Integer เจอแบบนี้ เราสามารถใช้ enum เข้ามาช่วยได้โดยการออกแบบ enum เตรียมไว้ก่อนได้ดังนี้


August 23, 2015

iOS9 Introducting the Contacts Framework

iOS9 จะมาพร้อมกับวิธีการเข้าถึง Address Book แบบใหม่ผ่าน Contacts Framework โดยจุดที่น่าสนใจก็คือ Framework ตัวนี้จะช่วยเราให้รอดพ้นจากความน่าเบื่อของ AddressBook Framework ตัวเดิมไปได้สักที ผมเชื่อว่าหลายคนต้องเบื่อ และรู้สึกว่า AddressBook Framework มันยากเย็นและดูซับซ้อน อีกทั้งวิธีการใช้งานก็ดูจะไม่เข้ากันกับ Objective-C เอาซะเลย

ดึงรายชื่อจาก Contacts ทั้งหมดที่มี
มาเริ่มลองดึงรายชื่อจากสมุดรายชื่อเลยดีกว่า โดย import Contacts ข้ามาใช้งาน จากนั้น สร้าง func listAllContacts() แบบนี้


August 01, 2015

Swift Type inference กับการลดรูป Closure

Closures คล้ายกับ functions และ method มันคือ block ของโค้ดที่เราเรียกใช้มัน แต่ไม่ได้เหมือนกันซะทีเดียว เพราะ closure ไม่มีชื่อ และมีความสามารถบางอย่างต่างออกไป เช่นการ capture value ที่เกิดใน scope เดียวกัน (บทความนี้ไม่ได้พูดถึง)

สำหรับหลายคนเมื่อเห็น syntax ประมาณนี้จะเกิดความสงสัยว่า โค้ดแบบนี้มาจากไหน

myArray.sorted{$0 > $1}

ซึ่งบทความนี้จะเล่าถึงที่มาที่ไปของมัน เริ่มจากลองดูตัวอย่างจาก method sorted ของ Array กันครับ

func sorted(isOrderedBefore: (T, T) -> Bool) -> [T]

method นี้มี parameter  1 ตัวชื่อ isOrderedBefore ซึ่งเป็น function ที่รับ parameter 2 ตัวชนิด T (ชนิดของข้อมูลที่ array บรรจุอยู่)  และ return Bool กลับออกมา ซึ่ง method sorted จะ return Array ที่เรียงเสร็จแล้วกลับออกมาอีกที

จากนิยามของ method sorted เมื่อเราลองลองสร้าง function เพื่อใช้เป็น parameter ตามที่นิยาม (รับ parameter 2 ตัว และ return เป็น Bool) ดู ก็จะได้โค้ดออกมาแบบนี้


ลองรันโค้ดดูจะพบว่า ได้ array ที่เรียงกันตามตัวอักษรถูกต้อง โดยอิงตามกฎที่ว่า ใครมาทีหลัง ให้มาก่อน

July 31, 2015

อีกทางสวยๆ ? ในการกำหนด Style ให้กับ IBOutlet

การเขียนโค้ดกำหนดสี, ฟอนต์, หรือ Accessibility เป็นอะไรที่ค่อนข้างเหนื่อยหน่ายสำหรับหลายๆ คน ซึ่งปกติแล้วเราคาดหวังว่ามันควรถูกกำหนดค่าทุกอย่างได้ผ่าน Storyboard สิ

แต่ในหลายๆ ครั้งเราก็จำเป็นต้องเขียนโค้ดเพื่อกำหนดค่าเริ่มต้นต่างๆ ให้กับ IBOutlets เอง ซึ่งก็มักเข้าไปเขียนทิ้งไว้ใน ViewDidLoad ซึ่งบางทีโค้ดก็ยาวมาก และบางทีเราก็สร้าง method สำหรับกำหนดค่าต่างๆ ให้กับ IBOutlet อีกที แบบนี้


แต่ก็มีอีกทางหนึ่งที่เราสามารถทำได้ คือไปกำหนดไว้ใน didSet เลยแบบนี้

July 19, 2015

Automatic UI Testing ด้วย Xcode 7

Xcode 7 มาพร้อมกับ Automatic UI Testing ที่จะช่วยให้เราสามารถทดสอบ UI ได้ง่ายมากขึ้นกว่าวิธีเดิมๆ มาก ซึ่งจุดเด่นของ Automatic UI Testing ที่มาพร้อมกับ Xcode 7 ก็คือ
  1. ไม่จำเป็นต้องเขียน script ทดสอบเองทั้งหมด เพราะมีระบบบันทึก (UI Recording) การใช้งาน และสร้างโค้ดออกมาให้เราเองอัตโนมัติ สิ่งที่เราต้องทำเพิ่มก็คือ เขียนและออกแบบเงื่อนไข ต่างๆ ที่เราต้องการทดสอบ
  2. เข้าถึง UI Element ต่างๆ บนหน้าจอด้วยการอ้างถึง element นั้นๆ จริงๆ ไม่ใช่การกำหนดพิกัด หรืออ้างตำแหน่งของการแตะ หรือการ swipe ซึ่งการระบุพิกัดมีข้อเสียมากๆ ก็คือ หากแอปเราทำงานบนหน้าจอหลากหลายขนาด วิธีการนี้อาจใช้งานไม่ได้เลย ยิ่งถ้าแอปเรามีการเคลื่อนย้าย UI Element บนหน้าจอในขณะใช้งานด้วยแล้วล่ะก็ยิ่งแย่ไปใหญ่ ซึ่งการอ้างถึง UI Element ต่างๆ บนหน้าจอนั้น Xcode 7 จะใช้ความสามารถของ Accessibility ที่มีมาบน iOS ก่อนหน้านี้นานแล้ว (แต่นักพัฒนาหลายท่านไม่ค่อยใช้กัน -- รวมทั้งผมเองด้วย)
  3. รัน Test ไปพร้อมๆ กับ การรัน Unit Test ตามปกติ ไม่ต้องแยกแอปออกมาต่างหาก เหมือนกับการทำ UI Test แบบเดิมๆ ที่ต้องรัน Instrument ขึ้นมา ซึ่งวุ่นวาย และช้าอืดอาด ... ใช่แล้ว ตอนนี้ Automatic UI Testing ผนวกเข้าเป็นหนึ่งเดียวกับ Xcode 7 เลย!
  4. ใช้ XCTest Framework ที่คุ้นเคย

Search APIs ใน iOS9

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

การทำให้ Spotlight รู้จักเนื้อหาที่ต้องการภายในแอปของเรา มี 3 ขั้นตอนดังนี้
  1. สร้าง CSSearchableItemAttributeSet เพื่อใช้เก็บเนื้อหาที่เราอยากให้ Spotlight แสดงในผลการค้นหา (เช่น title, description และภาพประกอบ)
  2. เก็บ CSSearchableItemAttributeSet ลงใน  CSSearchableItem
  3. ส่ง CSSearchableItem ให้ CSSearchableIndex ทำ index เพื่อให้ Spotlight หาเจอ
จาก 3 ขั้นตอนที่ว่ามา ก็จะได้หน้าตาโค้ดดังนี้

July 15, 2015

ทำความรู้จักกับ defer ใน Swift 2

คำสั่ง defer ถูกเพิ่มเข้ามาใน Swift 2 คำสั่งนี้ช่วยการันตีได้ว่าโค้ดที่อยู่ในบล็อคที่ประกาศโดยใช้ defer จะทำงานก่อนจบฟังก์ชัน, เม็ดธ็อด หรือ scope เสมอ

ดูตัวอย่างปัญหา


จากตัวอย่าง ฟังก์ชันจะเปิดไฟล์ จากนั้นตรวจสอบและเขียนข้อมูลโดยใช้ guard (ทำความรู้จักกับ guard ใน Swift 2) และบรรทัดสุดท้ายสั่งปิดไฟล์

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

ทางแก้ของปัญหานี้ทำได้ 2 ทาง คือ เขียนคำสั่งปิดไฟล์ไว้ก่อน return ทุกๆ อัน และอีกทางหนึ่งคือทำ Pyramid of Doom ซึ่งทั้ง 2 ทางที่กล่าวถึง ล้วนไม่ใช่ทางออกที่ดีนัก แล้วทางออกไหนล่ะที่ดีกว่า?

July 13, 2015

ทำความรู้จักกับ guard ใน Swift 2

คำสั่ง guard เป็นของใหม่ที่ถูกเพิ่มเข้ามาใน Swift 2 และถูกเปิดตัวใน Apple's Platform State of the Union

จริงๆ แล้ว guard ก็คล้ายกับคำสั่ง if ที่ใช้ตัดสินใจว่าจะทำงานหรือไม่ทำงานโดยอิงกับ boolean ที่ส่งไปให้ตรวจสอบ แต่สิ่งที่ต่างกันชัดเจนก็คือโค้ดที่อยู่ในบล็อกคำสั่ง guard จะทำงานก็ต่อเมื่อค่าความจริงที่ทดสอบเป็นเท็จ ซึ่งวิธีตัดสินใจแบบนี้ก็จะคล้ายกับ assert นั่นเอง

เปรียบเทียบเทคนิคปกติที่ใช้กันอยู่


นี่คือท่าปกติที่หลายคนมักใช้ตรวจสอบว่าค่าที่ส่งเข้ามาในฟังก์ชั่นมีค่าตรงตามต้องการหรือไม่ หากไม่ใช่สิ่งที่ต้องการ ก็จบฟังก์ชัน ไม่ต้องทำอะไร แต่จริงๆ แล้วทำแบบนี้จะพบว่ามีจุดสังเกตอยู่ 2 จุด ได้แก่
  1. เรากำลังตรวจสอบโดยใช้เงื่อนไขของสิ่งที่เราไม่ต้องการ ไม่ได้ใช้เงื่อนไขของสิ่งที่เราต้องการมาตรวจสอบ (ส่วนใหญ่แล้วเรามักตรวจสอบกันแบบไหนเอ่ย?)
  2. หากต้องการใช้ตัวแปรที่ถูกตรวจสอบว่าใช้งานได้แล้ว เราจำเป็นต้องบังคับ unwrap optional value ก่อนจะนำมันไปใช้