Swift Substrings
มาว่ากันเรื่อง 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 โปรโตคอลที่ชื่อว่า ForwardIndexType ด้วย ซึ่งนี่เป็นการออกแบบที่เรียกว่า Orthogonal Design เพื่อการนำกลับมาใช้ใหม่ได้ทุกๆ container ใน Swift
แล้วถ้าเราอยากเขียนง่ายๆ แบบที่ผมไปด้านบนล่ะ ? จะทำอย่างไร... ถ้ามันไม่มีมาให้ ก็ทำเองสิ
เท่านี้เราก็จะสามารถเขียนในรูปแบบนี้ได้แล้ว
แต่ใน 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 โปรโตคอลที่ชื่อว่า ForwardIndexType ด้วย ซึ่งนี่เป็นการออกแบบที่เรียกว่า Orthogonal Design เพื่อการนำกลับมาใช้ใหม่ได้ทุกๆ container ใน Swift
แล้วถ้าเราอยากเขียนง่ายๆ แบบที่ผมไปด้านบนล่ะ ? จะทำอย่างไร... ถ้ามันไม่มีมาให้ ก็ทำเองสิ
เท่านี้เราก็จะสามารถเขียนในรูปแบบนี้ได้แล้ว
Comments
Post a Comment