Tag Archives: เขียนโปรแกรมด้วย Swift

Swift String กับภาษาไทย

วันก่อนๆ มีคนโพสในกลุ่มของ iOS Dev Thai เกี่ยวกับปัญหาภาษาไทยของ swift string ว่ามันไม่สามารถค้นหาคำได้อย่างที่ต้องการ ยกตัวอย่างเช่น

จากตัวอย่างง่ายๆนี้จะเห็นว่า เราสามารถหาคำว่า “ชี” ได้  แต่ในขณะที่ “ช” ตัวเดียวนั้นกลับหาไม่เจอ

ว่าแต่ทำไม มันหาไม่เจอละ ?

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

ถ้าหากเรานับจำนวนตัวอักษร มันก็จะนับได้แบบนี้

ก็จะเห็นว่า ไม่ว่าจะเป็น ก , กู , กู้ มันก็นับได้ 1 เหมือนกัน

ในภาษาจำพวกภาษาอังกฤษ ตัวอักษณ e กับ é เขามองเป็นตัวอักษรคนละตัวอักษร

จากโค้ดข้างบน มันก็ทำงานถูกละ เพราะ e กับ é มันคนละตัวอักษร

แต่ในกรณีของภาษาไทย  เราไม่ได้นับ ช กับ ชี เป็นตัวอักษรคนละตัวกัน แต่เราบอกว่า มันคือ

  • ช ที่มี สระ อี

ดังนั้นแล้ว มันจึงเกิดปัญหาว่า เมื่อใช้เมธอด อย่าง contains เนี่ย มันเจอ “ชี” แต่กลับไม่เจอ “ช” เพราะมันมองว่าเป็นคนละตัวกัน

เราจะแก้ปัญหานี้ยังไงดี

วิธีการแรก คือ ใช้เมธอด localizedStandardCompare เมธอดนี้ มีใช้ใน iOS9

เมธอดนี้ อาจจะแก้ปัญหาเรื่องที่ว่า มันหา “ช” ไม่เจอ

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

อย่างเช่นมี “ก” ตัวเดียว แต่ถ้าหาด้วย “กู้” มันก็จะบอกว่า เจอเหมือนกัน เช่นตัวอย่างนี้

 

วิธีการที่สองคือ เปรียบเทียบ ตาม character ไปทีละตัว โดยใช้เมธอด range(of:) แล้วก็กำหนด option ให้เป็น literal ซึ่งเราอาจจะเขียนออกมาเป็น extension ง่ายๆ แบบนี้

จะเห็นว่าผลลัพธ์นั้นให้ความถูกต้องมากกว่าวิธีการแรก
วิธีการแรก อาจจะเหมาะกับการค้นหาแบบ คร่าวๆ อย่างเช่นการ search แต่ถ้าหากต้องการผลลัพธ์ที่ถูกต้องวิธีที่สองน่าจะเหมาะสมกว่า

หวังว่าจะช่วยให้หลายคนหายสงสัยเกี่ยวกับ String ใน Swift นะครับ

Swift – The new road

นับตั้งแต่ Apple ได้ประกาศ iOS 8 ในเดือนมิถุนายนที่ผ่านมา แผนการเขียนหนังสือ Objective-C ที่วางแผนไว้ก็ต้องพับเก็บหมด แม้ว่าผมเขียนเสร็จไปแล้วก็ตาม ทั้งนี้ก็เป็นเพราะว่าทาง Apple ได้ประกาศภาษาใหม่ที่ใช้พัฒนา iOS ขึ้นมานั่นก็คือภาษา Swift ( Swift คือชื่อของ นก )

Why Swift ?

ต้องยอมรับอย่างหนึ่งว่า Objective-C นั้นล้าหลังมาก เนื่องจากเป็นภาษา ที่เกิดมานานแล้ว ก่อนจะเกิด Java ด้วยซ้ำไป ทำให้ตัวภาษานั้นขาด feature หลายๆอย่างที่ภาษาโปรแกรมสมัยใหม่มี  แม้ปีหลังๆจะเพิ่มเติมหลายสิ่งเข้ามา เช่น properties , extension และ ARC  และตัวภาษาปรับปรุงให้มีประสิทธิภาพดีมากขึ้นกว่าเดิม แต่อย่างไรก็ตาม ภาษา Objective-C นั้นเป็นภาษาที่ใช้เวลาในการเรียนรู้ค่อนข้างสูง และมี syntax หน้าตาค่อนข้างประหลาดเช่น ยกตัวอย่างเช่น การเรียกใช้เมธอด ก็จะใช้สัญลักษณ์ [ ] ดังเช่น

[obj method];

แต่ในกรณีของภาษาอื่นๆเช่น java , c++ , c# และแม้กระทั่ง python ก็จะเขียนแทบจะเหมือนๆกัน คือ

obj.method();

เห็นได้ชัดเลยว่าภาษา Objective-C นั้น มันช่างแต่งต่างจากชาวบ้านเหลือเกิน ยิ่งในช่วงหลังมี block เข้ามาด้วย ตัว syntax ของภาษาก็ยิ่งแปลกประหลาดไปกันใหญ่ ปัญหาสองอย่างนี้มันเป็นปัญหาที่สาหัสพอสมควร เพราะนับวันผู้ใช้ Objective-C ก็มากขึ้นเรื่อยๆ และถ้ามองย้อนใน 5  ปีหลัง จะเห็นว่าภาษา Objective-C เพิ่ม feature ไปหลายอย่างมากมาย  เมื่อมองระยะยาวแล้วมันก็เหมือนแก้ปัญหาเฉพาะหน้าไปเรื่อยๆ  ทางออกของ Apple ก็คือสร้างภาษาใหม่ทดแทนภาษา Objective-C เพื่อแก้ปัญหาในระยะยาว และนั่นเลยเป็นที่มาของภาษา Swift

Swift History

ภาษา Swift นั้นมีจุดกำเนิดมาจาก Chris Lattner เขาเป็นคนเดียวกับ คนที่สร้าง LLVM Compiler ซึ่งเป็นคอมไพลเลอร์สมัยใหม่ มีประสิทธิภาพสูง (ผมเคยเขียนเรื่อง LLVM ไว้แล้ว)  Chris นั้นได้เข้ามาทำงานกับ Apple ตั้งแต่เมื่อ 2005 จากวิทยานิพนธ์ ป.เอก เรื่อง LLVM ( ถ้าหากสนใจการทำงาของ llvm ลองไปอ่านที่ Chris เขียนไว้ได้ http://aosabook.org/en/llvm.html )  เมื่อ Chis เริ่มทำงานกับ Apple สิ่งแรกที่ได้ปรับปรุงให้กับ Objective-C ก็คือโปรเจค Clang ซึ่งเป็น front-end compiler ให้กับภาษา C , C++ และ Objective-C จากการโปรเจคนี้เองทำให้ Chris เห็นข้อจำกัดของ Objective-C และต้องการจะเปลี่ยนมัน เขาจึงเริ่มสร้างภาษา Swift ในปี 2010

หากดูภาพใหญ่ของภาษา Swift แล้ว มันมีส่วนคล้ายกับภาษา Objective-C อยู่มาก ดังคำกล่าวในงานเปิดตัว Swift ไว้ว่า “Objective-C with out C” และเมื่อดู syntax ของภาษา Swift จะพบว่ามีลักษณะคล้ายกับภาษาสคริป แต่ตัวมันเองนั้นกลับไม่ใช่ภาษาสคลิป เหมือนอย่าง java script , php หรือ python แต่อย่างใด เพราะโปรแกรมภาษา Swift นั้นต้องผ่านการคอมไพล์ให้เป็นไบนารี่ไฟล์ เหมือนกับภาษา Objective-C , C, C++ เสียก่อน ถึงจะทำงานได้ (ไว้วันหลังจะเขียน blog เกี่ยวกับ feature ของภาษา)

คริสได้บอกว่าเค้าสร้าง Swift ด้วยการผสมผสานภาษาต่างๆเข้าไว้ด้วยกัน

“drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list”

ในการออกแบบภาษายังมีผู้เชี่ยวชาญทาง compiler และ document guru เข้ามาทำงานนี้อีกหลายคน ดังนั้นแล้วภาษา Swift จึงเต็มไปด้วยสิ่งใหม่ๆ idea ใหม่ๆ และการทำงานที่ง่าย และเรียนรู้เร็ว

Continue reading Swift – The new road