Posts

Showing posts with the label string

Swift Substrings

Image
มาว่ากันเรื่อง Substrings กัน ใครเคยเขียน Objective-C มาคงไม่มีปัญหาอะไรกันมาก เพราะการใช้ NSRange ไม่ใช่เรื่องยากเลย เวลาเราจะดึง Substring สักชุดออกมาจาก String นั้น เขียนแค่ แต่ใน Swift นั้นจะต่างกันโดยสิ้นเชิง เพราะ ภาษาที่มีลักษณะเป็นภาษาสคริปท์ นั้น จะออกแบบมาให้ใช้ระบบ Range แบบนี้ซะเป็นส่วนใหญ่ โดยถ้าเขียนให้ได้ผลลัพธ์เดียวกันใน Swift จะต้องเขียนแบบนี้ โดยฟังก์ชั่นที่ชื่อว่า advance ก็จะทำหน้านี้คล้ายๆ กับ NSMakeRange() ด้านบนนั่นแหละ จะเรียกว่าเหมือนเลยก็ได้ แต่ใครหลายคน (รวมทั้งผม) ที่เคยเขียนภาษาอย่าง Python, Ruby มา ก็อาจจะงงว่า ทำไมไม่ใช่ Int ไปตรงๆ เลยล่ะ จะได้ง่ายดีเช่น เช่น text[2..<4] อะไรแบบนี้ พอเราเข้าไปดูลึกๆ นั้น Ranges บน Swift ถูกออกแบบมาอย่างดีเลย เพราะมันมี extension บน String class ซึ่งประกาศ struct ที่ชื่อว่า Index และแสดงในอีกชื่อคือ String.Index ซึ่งถูกเขียนให้ conform โปรโตคอลที่ชื่อว่า BidirectionalIndexType เพื่อให้ทำการวนซ้ำภายใน String ได้ นอกจากนั้นฟังก์ชั่น advance มีการจะต้องรับค่าตัวแปรที่ conform โปรโตคอลที่ชื่อว่า Forwar...

Interesting iOS 3rd Party Library #5

Image
หายไปนานสำหรับ Series นี้ อยากจะมาบอกว่า สิ่งที่ผมโพสต่อไป ก็จะรวมๆ กันทั้ง Objective-C และ Swift นะ เพราะมันใช้ร่วมกันได้อยู่แล้ว ส่วนทำอย่างไรนั้น ลองดู การใช้ Cocoapods บน Swift เป็นแนวทาง Alamofire :  https://github.com/Alamofire/Alamofire ง่ายๆ มันคือ AFNetworking ที่เขียนด้วย Swift นั่นเอง จากคนเขียนคนเดิมที่เราคุ้นหน้าคุ้นตากันดี Async :  https://github.com/duemunk/Async อันนี้เป็น GCD Wrapper สำหรับทำงาน Asynchronous ต่างๆ ผมว่าเขาทำออกมาได้น่ารักดีนะ แต่เสียอย่างเดียว เท่าที่เอาไปใช้ก็คือ มันต้องประกาศตัวแปรมารับค่าในแต่ละ Block เนื่องจากเขาเขียนมันในลักษณะของ method chaining ก็เลยไม่สามารถใช้งาน bound variable ตรงๆ แบบการเขียน block ซ้อน block แบบใช้ GCD ได้ Swift String Tools :  https://github.com/JamalK/Swift-String-Tools มาในรูปแบบของ Extension บ้าง นี่เป็น helper ที่อาจจะช่วยให้เราทำงานกับ Swift's String ง่ายขึ้น :) ลองติดตาม ผมว่าน่าจะพัฒนาได้อีกเรื่อยๆ เลยล่ะ M13ProgressSuit :  https://github.com/Marxon13/M13ProgressSuite ทุกอย่...

[iOS Dev] Localizations iOS App

Image
ไม่ได้เขียน Blog มาสักพัก เนื่องด้วยเหตุการณ์ชีวิตประหลาดๆ ที่ทำให้กำลังใจหดหาย เขียนไม่ออก แห่ๆ วันนี้เลย ลองเปิด New Post มาลองดู ก็พบว่าพอเขียนได้ เลยเขียนเรื่องง่ายๆ เป็นการเตรียมพร้อมก่อนเขียนของหนักๆ ที่จะตามมา วันนี้จะเขียนเรื่องการทำ Localized String ครับ เคยไหม เวลาที่จะต้องทำ App ให้ Support หลายๆ ประเทศ (ซึ่งขึ้นอยู่กับการเลือก Locale ของผู้ใช้ด้วย) จะทำอย่างไรกับ String เหล่านั้น เช่น จาก "1 month" เป็น "1 เดือน" อะไรประมาณนี้ เริ่มจากการสร้าง Localize File ขึ้นมาก่อน เลือก New File แล้วไปที่ประเภท Resource File แล้วเลือกเป็น Strings File โดยไฟล์นี้เราจะตั้งชื่อว่า Localizable.strings นะ จากนั้นไปที่ Project Navigation จากรูป ให้เลือกที่ Project นะครับ อย่าเลือกเป็น Target ก็จะได้หน้าจอตามรูปนี้ ดูตรงหัวข้อ Localizations  จะเห็นว่าเราสามารถเพิ่ม Localize Language ลงไปได้ ก็จัดการเพิ่มไปซะเลย ในที่นี้ผมเพิ่มภาษาไทยนะครับ  คราวนี้ให้เราไปเลือกไฟล์ Localizable.strings ที่เราสร้างขึ้นมา แล้วเปิด Right Sidebar ก็จะพบกับหน้าต่างนี้ ให...

Problem when using 'getline' with 'cin' in C++

Image
ว่าด้วยปัญหาที่ถูกตั้งคำถาม Classic เวลาเราใช้ cin ใน C++ กันเลยนะ นั่นคือการใช้ cin รับ input ที่เป็น string with whitespaces เช่น "this is a cat" ซึ่งจะเห็นได้ว่า เราจะได้แค่ "this" เก็บไว้ในตัวแปรเท่านั้น ถ้าต้องการรจะรับ Input ที่เป็น String with whitespaces ให้เปลี่ยนมาใช้ cin.getline(char_array_variable, stream_size) กรณีที่ตัวแปรเป็น Array of Character หรือ getline(cin, string_variable) ในกรณีที่ตัวแปรเป็น C++ String (#include <string>) http://www.cplusplus.com/reference/istream/istream/getline/ แต่ปัญหาที่ผมจะกล่าวถึงมาจากการที่เราไม่สามารถใช้ cin.getline กับตัวแปรชนิดอื่นๆ ได้นอกจาก string (or array of character) เราก็เลยต้องกลับไปใช้ cin นั่นแหละ ปัญหาที่เกิดขึ้นคือ ถ้าเราเรียกใช้ cin.getline ต่อจาก cin มันจะข้ามการ input ของ cin.getline ไปเลย ดังภาพครับ สาเหตุของปัญหาคือ ... คำสั่ง cin จะมี Newline Character (\n) ตอนที่เรากด Enter ติดท้ายมาเสมอ ... ทำให้เจ้า getline ที่ตามหลังมานั้นคิดว่า Newline Character เป็น stream ...

[iOS Dev] Matching substring with Regular Expression

Image
Regular Expression คือ String ที่ไว้ใช้อธิบายรูปแบบของข้อความที่เรากำหนด ซึ่งสามารถอ่านรายละเอียดเกี่ยวกับ Regular Expression กับ Format ได้ที่นี่ครับ http://en.wikipedia.org/wiki/Regular_expression http://www.regular-expressions.info ใน Entry นี้เราจะมาดูประโยชน์ที่ใช้กันอย่างแพร่หลายของ Regular Expression นั่นคือ การทำ String Matching ซึ่งสามารถใช้ได้ในหลายลักษณะ เช่น “ให้ผู้ใช้ใส่ Email ตาม format ที่เราต้องการ” => “[a-zA-Z0-9_]+@[a-zA-Z0-9_]+.[a-z]{2-4}” “ใส่ชื่อตาม format ที่กำหนดไว้” => “[a-zA-Z]+” ง่ายๆ คือพวก Web Developer ทั้งหลายจะใช้ในการ validate form ต่างๆ น่ะครับ :) แต่ตัวอย่างที่จะใช้ในวันนี้คือ การหา # (hashtag) ในข้อความ ซึ่งสามารถนำไปประยุกต์ใช้ในการค้นหา Substring รูปแบบต่างๆ ที่เราต้องการ ใน String ได้ โดย Cocoa นั้นก็มี Class NSRegularExpression ให้ใช้ได้ไม่ยากนัก :) NSRegularExpression Reference แต่จะเห็นได้ว่า format แบบนี้จะ Detect ภาษาไทยไม่ได้ ผมก็ได้ค้นหาไปเจอ Blog ของพี่คนหนึ่งใน Twitter @pokpitch ซึ่งสามารถทำได้ 2 แบบนั่...

[iOS Dev] Split a String into an Array and Another String Manipulation [Objective-C]

Image
ผมก็พึ่งเคยได้ใช้ Method นี้เพื่อเล่นอะไรหลายๆ อย่างเลยแหละครับ งานที่อาจารย์สั่งมา ผมก็ใช้ Method นี้ช่วยในการส่ง Message อะไรสักไปหา Server แล้วมันมีประสิทธิภาพกว่าที่คิดเลย ^___^ ก็ตามหัวข้อนะครับ ขอเอ่ยถึง Java ก่อน ทุกคนอาจจะคุ้นๆ แบบนี้ จาก myString เราก็จะได้ Array of String ที่คั่นด้วยเครื่องหมาย , (comma) ในที่นี่ก็จะได้ {"a","b","c","d","e"} งั้นเรามาดูในแบบของ Objective-C กันบ้าง ... ใช้กรณีไหน ? วันนี้ผมลองเล่นการส่ง E-mail ผ่าน iOS Apps ดู... และต้องการส่งเมล์หาคนหลายๆ คนครับ (คงนึกกันออกนะ ^__^) อันแรกนี่ก็จะคล้ายกับ Method ใน Java ด้านบนนะครับ... ส่วนอันนี้ก็จะใช้ CharacterSet ในการทำงาน ในกรณีที่อยากจะ split หลายๆ Character อันนี้แถมครับ ถ้าเรา String อยู่ตัวนึง จัดการ Split มันกลายเป็น Array of Character ซะ Blog สั้นๆ กันลืม ~ Credit ::  http://www.idev101.com/code/Objective-C/Strings/split.html และจาก Credit ที่ผมให้ไว้... ก็ค้นๆ ไปเจอ String Manipulation อื่นๆ ที่น่าสนใจด้วยครับ ^___^...