Review Steelcase think – รีวิวเก้าอี้ steelcase think

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

ก่อนที่จะไปดูรีวิว ผมต้องเกริ่นที่มาที่ไปก่อน คืองี้ครับ พอดี ผมซื้อเก้าอี้มาจาก IKEA รุ่น มิลบาเรียต ราคาประมาณ 3 พัน มันก็นั่งสบายดีนะครับ แต่ว่าปัญหาใหญ่ๆ ของรุ่นนี้ก็คือ  หนังมันจะ “ลอก” ครับ อันที่จริง พนักงานที่ IKEA ก็บอกผมไว้ล่วงหน้าแล้วว่า ถ้าซื้อรุ่นที่มันเป็นหนังหุ้ม ใช้ไปนานๆ มันจะลอกนะ เค้าก็แนะนำให้ผมซื้อแบบปกติ ที่ไม่หุ้มหนัง ผมก็เข้าใจแหละว่ามันจะลอก แต่ไม่นึกว่า มันจะลอกเร็วขนาดนี้ เพราะใช้ไปแค่ 1 ปี กับอีก 3 เดือน มันก็ลอกเสียแล้ว

คือพอตัวเก้าอี้มันลอก เนี่ย ปัญหาใหญ่ของมันไม่ได้อยู่ที่เก้าอี้นะครับ เพราะตัวเก้าอี้ยังนั่งได้ปกติ แต่หนังที่มันหลุดออกมาเนี่ย ทำเอาบ้านสกปรกมากครับ

พวกหนังที่หลุดออกมาเป็นชิ้นๆ แบบสีดำๆ ในเนี่ย เกลื่อนเต็มห้องเลยครับ ใช้เครื่องดูดฝุ่น ก็เอาออกยาก กลายเป็นปัญหาใหญ่ ทำให้ผมต้องหาเก้าอี้ใหม่

ผมเคยนั่งเก้าอี้ที่เคยนั่งตอนที่ทำงานที่ออฟฟิศ เป็นเก้าอี้ยี่ห้อ Logica ผมอยากได้เก้าอี้แบบในออฟฟิศบ้าง ก็เลยคิดจะซื้อใหม่ แต่ปัญหาคือว่า ไม่รู้ว่า ยี่ห้อนี้มันซื้อที่ไหน ก็ไปดูตามพวก SB Furniture บ้าง แต่ลองนั่งเก้าอี้ในโซนออฟฟิศ ก็คิดว่าของ SB มันไม่ใช่แบบที่ต้องการเลย

แล้วบังเอิญว่าได้ไป CDC จะไปดูเฟอร์นิเจอร์ ก็เลยแวะไป ดูเก้าอี้ สักหน่อย ในนั้นมันจะมี ร้านขายเฟอร์นิเจอร์สำนักงานสองร้านคือ Modern Form กับ Perfect อะไรสักอย่างนี่แหละ .. คือผมก็แวะ ไปที่ perfect ก่อนนะ ชอบเก้าอี้ตัวหนึ่งในนั้นมาก ราคาประมาณ 7,900 แต่ยังไม่ตัดสินใจซื้อ คือมันก็ราคาแพงอยู่ ก็เลยกะว่าเดินดูอีกสักร้านก่อน เผื่อมีตัวเลือกเลือกที่ถูกกว่า

จนกระทั่งมาเจอกับเก้าอี้ Steelcase รุ่น Think ในโชว์รูมของ Modern Form เห็นมันลดราคาเหลืออยู่ราวๆ 10,000 บาท คนขายบอกว่าเป็นเก้าอี้ ออกแบบตามหลัก Ergonomic เหมาะกับการทำงาน ก็เลยไปลองนั่งดู

สรุปก็เลย ซื้อ Steelcase Think มาแทนเก้าอี้ที่เล็งไว้ก่อนหน้านี้ จากตั้งงบเก้าอี้ไว้ แค่ 5000 คราวนี้ บานปลายกลายเป็นหมื่นเลย เอาละ ไหนๆ ก็ซื้อมาแล้ว มาดูกันว่า เก้าอี้ราคาขนาดนี้มันได้อะไรมาบ้าง

Review

ข้อดี

ส่วนประกอบต่างๆ ของเก้าอี้อยู่ในขั้นดีมาก จับดูพลาสติก ก็ดูไม่ก๊อกแก๊ก เหมือนเก้าอี้ทั่วไปเท่าไหร่

ตัวเก้าอี้สามารถปรับระดับ การเอนด้วยการหมุนปุ่มด้านล่างเก้าอี้ได้ 5 ระดับ แล้วก็สามารถปรับความสูงของเก้าอี้ได้  ผมเคยใช้เก้าอี้พวกปรับความสูงได้ บางยี่ห้อนี่กดปรับยากมาก แต่ตัวนี้ปรับง่ายมาก ไม่ติดขัด

ในส่วนของที่วางแขนก็ปรับสูงต่ำได้เช่นกัน

นอกเหนือไปจากการปรับระดับความสูง เรายังสามารถ ปรับให้มันเอนเข้า-ออก ได้ตามชอบ แต่ข้อเสียคือ มันไม่สามารถล๊อกตำแหน่งได้

ในส่วนของ เบาะรองนั่ง นั้นนุ่มมากๆ และยังสามารถปรับ ให้มันชิด หรือห่างพนักพึงหลังได้

พนักพึง มันจะเป็นตาข่าย และมีลวดรองรับ ดูแล้วเหมือนมันจะแข็ง แต่พอนั่งเอนหลังแล้วก็สบายดี ไม่ได้แข็งเหมือนที่เห็น คนขายบอกกับผมว่า พวกเก้าอี้แบบที่เป็นตาข่าย ทนกว่า ฟองน้ำ

ตัวฐานล้อเป็นพลาสติก แอบเสียดายว่ามันน่าจะเป็นโลหะมากกว่า ในส่วนของล้อ ก็หมุนลื่นดี

ข้อเสีย

จากรูปจะเห็นว่า ที่วางแขนกว้าง ถ้าปรับให้มันกว้างสุด มันจะกว่าตัวโต๊ะ ทำให้ไม่สามารถเลื่อนเก้าอี้เข้าไปได้ (โต๊ะซื้อที่ IKEA ตัวนี้ก็ใช้งานดีนะ) ถ้าจะให้มันพอดีกับโต๊ะ ต้องปรับที่วางแขนให้เข้ามาอีก

ไม่มีที่รองคอ ทำให้ไม่สามารถเอนหลังพึงคอได้ ถ้าจะซื้อแบบมีที่พักคอ ต้องซื้อรุ่นที่มีที่พักคอ ราคาบวกไปอีก 3 พันบาท

สรุป

เป็นเก้าอี้ที่ดีมากๆ ตัวหนึ่ง แต่ราคาแพงเอาเรื่องอยู่ ตัวที่ผมซื้อมานี่เป็น Steelcase Think V1 ผมอยากได้สีดำมากกว่า สีเทา แต่คนขายบอกว่า บริษัทไม่นำเข้ามาแล้ว แล้วก็เหลือไม่กี่ตัว และคนขายเชียร์ให้ซื้อ V2 แต่ราคามันอยู่ที่ 17,000 แต่เมื่อก้มดูเงินในกระเป๋าแล้ว ไม่ไหวแพงไป แล้วก็อีกอย่างที่ตัดสินใจซื้อตัวนี้เพราะมันรับประกัน 12 ปี แต่ตัวใหม่ รับประกันแค่ 3 ปี

คือถ้าถามว่า เราจำเป็นต้องลงทุนกับเก้าอี้ขนาดนี้ไหม อันนี้ก็แล้วแต่คนเลยครับ คือส่วนตัวผมนั่งหน้าคอมพิวเตอร์ วันละ 6-8 ชม. เก้าอี้ มันจึงเป็นส่วนสำคัญในการทำงานมาก เพราะถ้าเก้าอี้ไม่ดี นั่งไปนานๆ มันให้เกิดพวก Office Syndrome ได้ ผมก็เลยตัดสินใจลงทุนซื้อเก้าอี้ดีๆสักตัว อย่างไรก็ตามถ้าจะซื้อเก้าอี้ที่ราคาขนาดนี้ ผมแนะนำให้ไปลองของจริงก่อนครับ ว่าชอบไหม เพราะแพงเอาเรื่องอยู่

หลักสูตรอบรมการเรียนโปรแกรมด้วยภาษา Swift จากเริ่มต้นสู่มือโปร

ในที่สุดก็เสร็จแล้วนะครับ กับคอร์สหลักสูตรการเขียนโปรแกรมด้วยภาษา Swift  มีความยาวกว่า 10 ชม. ผมกล้าพูดได้เต็มปากว่า ไม่น่าจะมีหลักสูตรในไทยที่ไหน สอนละเอียดขนาดนี้ เพราะมันอัดแน่นด้วยเนื้อหาแทบจะครบทุกๆอย่างของภาษา Swift ตั้งแต่ขั้นเริ่มต้นอย่างการประกาศตัวแปร ไปจนถึงเรื่อง Closure , Memory Management หรือ Generic

หลักสูตรที่ผมทำขึ้นมา ไม่ใช่ให้เขียนโค้ดตามอย่างเดียว แต่เน้นไปยัง “Fundamental” อธิบายถึงที่มาที่ไป รวมไปถึง concept ต่าง ซึ่งจะทำให้เข้าใจในการทำงานของส่วนต่างๆ ได้อย่างแท้จริง

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

ราคาเต็มอยู่ที่ 6400 บาท แต่ในช่วงเปิดคอร์สนี้ผมมีคูปองส่วนลดให้

สำหรับนักเรียน นักศึกษา ผมให้คูปองพิเศษ ลด 50% ให้ครับ ไม่ต้องไปแย่งกับคนอื่น 🙂 เพียงถ่ายรูป บัตรนักศึกษา และส่ง message มาทาง fb – fan page หรือจะส่ง email มาที่ macfeteria แอท gmail เพื่อยืนยันว่าเป็นนักศึกษาจริงๆ

และสำหรับผู้ที่ไม่มีบัตรเครดิต ส่ง email มาหาผมได้ครับ เดี๋ยวบอก รายละเอียดวิธีการสั่งซื้อให้

เนื้อหามีประมาณ 20 กว่าบทได้แก่

  • Variable
  • Operator
  • Making Decision
  • String
  • Collection ( Array , Dictionary )
  • Loop
  • Switch
  • Function
  • OOP
  • Initializer
  • Closure
  • Memory Management
  • Structure
  • Enumeration
  • Protocol
  • Extension
  • Error Handling
  • Generic

ในแต่ละบทยังแบ่งย่อยออกเป็นอีกหลายๆเรื่องนะครับ ลองเข้าไปดู Course ได้ครับที่

https://www.udemy.com/swift-th

ปล 1. ผม update course ให้ตลอดนะครับ หากมีเนื้อหาใหม่ๆเพิ่มเติม
ปล 2. ผมทำคูปองมาให้แล้ว ก่อนซื้อโปรดใช้คูปอง นะครับ

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 นะครับ

What you should know about iOS Dev in 2017

2-3 เดือนหลังๆมานี่ผมไม่ค่อยได้เขียน blog เท่าไหร่ ก็ด้วยเพราะว่า มัวแต่ทำ Video Swift ที่จะเปิดสอนในปีหน้า แต่วันนี้เป็นโอกาสดีที่ผมจะเขียนเกี่ยวกับ สิ่งที่คุณควรจะรู้เกี่ยวกับ Swift และ iOS ในปี 2017 ที่จะมาถึงนี้ ..

ผมเชื่อว่า ณ ตอนนี้จำนวน iOS Dev เมืองไทย คงมีเยอะมากกว่าสมัยที่ผมเพิ่งจะเริ่มเขียน Blog นี้ สัก 100 เท่าได้มั้ง มีคนเก่งมากมายกว่าแต่ก่อน ยิ่งถ้าเนื้อหาแบบ Basic แล้วผมว่า คนทั่วๆไปก็คงน่าจะพอรู้หมดแล้วแหละ เพราะว่า เวปต่างๆ ก็มีให้อ่านมากมาย ทั้งไทย ทั้ง ตปท. นับว่า สิ่งทีดีมากครับ ยิ่งมีคนเก่งมาก เท่าไหร่ ประเทศเราจะพัฒนาเร็วเท่านั้น

ตามความตั้งใจแรกของผมคืออยากจะเขียน blog เกี่ยวกับ mac dev ตั้งแต่สมัย Apple ยังไม่ออก iPhone ด้วยซ้ำไป จนปัจจุบันมีนักพัฒนา iOS , Mac มากมาย ซึ่งมันก็บรรลุจุดประสงค์ของผมแล้ว เอาตรงๆนี่ผมยังตกใจเลยว่า นี่ผมเขียน blog นี้มาตังแต่ปี 2008 เลยเหรอ แม้ว่าจำนวน Dev จะเพิ่มมากกว่าแต่ก่อน อย่างไรก็ตาม ผมคิดว่า จำนวนไม่ใช่สิ่งสำคัญแล้ว สิ่งที่สำคัญกว่าคือ คุณภาพ ซึ่งการที่จะยกระดับ Dev ไทยให้เก่ง กว่า ณ ปัจจุบัน ได้นั่นก็คือ Dev เองนั้นควรจะรู้ว่า ตอนนี้ โลก เค้าไปถึงไหนกันแล้วบ้าง ดังนั้นผมจะขอ List สิ่งต่างๆ ที่ iOS และ Swift Dev นั้นควรจะศึกษาไว้ หรือถ้าไม่ศึกษา ก็ควรจะได้ยินคำศัพท์ พวกนี้บ้าง ซึ่งผมจะแบ่งเป็นหลายๆ หัวข้อ อธิบาย สั้นๆ ว่ามันคืออะไร ส่วนที่เหลือ ก็ไปศึกษากันเองนะครับ

Programming Paradigm

  • Protocol Oriented Programming
    สำหรับปีนี้ค่อนข้างจะมาแรงมาก คือเป็นแนวทางการเขียนโปรแกรมด้วย protocol (ส่วนตัวผมคิดว่าใช้ protocol  แบบเพียวๆไม่ได้หรอก แต่มันเป็น concept ที่ควรศึกษาไว้)
  • Functional Programming
    แม้ว่า swift ไม่ใช่ภาษา functional แบบเพียวๆเหมือนอย่าง haskell แต่ว่า swift ก็เขียนแบบ functional ได้เหมือนกัน อย่างน้อยๆคุณควรจะใช้ filter , map , reduce อะไรแบบนี้เป็นบ้าง

Tools

  • Cocoapod
    หลายคนน่าจะคุ้นเคยกันดี กับ package manager ตัวนี้ คือถ้ายังไม่เข้าใจว่ามันคืออะไร คุณควรจะศึกษามันเสียตั้งแต่วันนี้
  • Carthage
    เป็น package manger เหมือนกัน แต่มีแนวคิด ต่างออกไปจาก cocoapod เพราะมันไม่รวม repo ไว้ตรงกลาง และมันไม่ไปแก้ไข project setting ของเรา (หลังๆมานี่ผมใช้ carthage แทน cocoapod)
  • Fastlane
    มันคือ Continues Delivery Tool ตัวหนึ่ง และมันประกอบไปด้วย เครื่องมืออีกยิบย่อยมากมาย ช่วยให้เราทำงานได้เร็วขึ้น
  • Swift Package Manager
    ตัวนี้เป็น package manger ของ swift เองเลย ณ ปัจจุบันที่ผมเขียน ยังไม่รองรับ iOS แต่เหมาะสำหรับใช้งานกับ Linux
  • Swift Tool Chain
    คือถ้าใครเขียน Swift บน Linux หรือพวก Server Side อันนี้ควรจะรู้บ้าง
  • Fabric (Crashlytic , Beta)
    อันนี้ของพื้นฐานเลยนะครับ สำหรับช่วยให้เราดูได้ว่าหลังจาก ปล่อย app ไปแล้วมัน crash ตรงไหน

Architecture Pattern

  • MVC
  • MVVM
  • MVP
  • Viper

ถ้าเขียน iOS นี่อย่างน้อยคุณควรจะเข้าใจ Architecture Pattern อย่าง Model View Control (MVC) บ้างนะครับ ถ้าแม้แต่ MVC ยังไม่รู้ว่ามันคืออะไร นี่ผมว่าแย่ครับ ควรจะรีบไปศึกษาให้เข้าใจ สำหรับคนที่เข้าใจแล้ว หลังๆมานี้ ก็มีพวกโมเดล อื่นๆ ที่ควรจะรู้ไว้บ้างครับ เพราะหลายๆที่ก็เริ่มใช้โมเดลอื่นนอกจาก MVC แล้ว

Mind-Set

  • Agile
  • Continues Integration , Continues Delivery ( CI/CD)

สมัยนี้แล้ว บริษัทไหนยังทำงานแบบ waterfall อยู่อันนี้ผมว่า ควรจะลองศึกษาการทำงานแบบ agile ได้แล้วนะครับ เพราะทั่วโลกเค้าใช้วิธีการทำงานแบบนี้แทบจะทั้งนั้น (ผมไม่ได้บอกว่ามันดีที่สุดนะ อย่าง Google เองก็ไม่ได้ใช้ Agile ) นอกจากการทำงานแบบ agile แล้ว สิ่งหนึ่งที่คุณจะได้ยินบ่อยมากคือ CI/CD ควรจะศึกษาไว้ครับ

Engineering Practice

  • Unit Test
  • TDD
  • Automate Test
  • Pair Programming

ใครยังไม่เคยเขียน Unit Test เลย ควรจะลงมือศึกษามันโดยด่วน จากประสบการณ์ส่วนตัว ถ้าคุณเขียน Unit Test ไม่เป็น ผมบอกเลยว่า คุณแทบจะไม่มีโอกาสได้ทำงานกับบริษัทชั้นนำเลย (เว้นแต่ว่าคุณทำงานสาย Game การเขียน unit test , automate test นั้นไม่ค่อยมีใครทำเท่าไหร่)

Swift Server Side

  • IBM Kitura
  • Vapor
  • Perfect

ตอนนี้ก็มีหลายบริษัท กำลังเอา Swift ไปเขียน backed ผมว่านี่เป็นโอกาสที่ดี ทีคุณน่าจะลองศึกษา swift สำหรับ server บ้างครับ ส่วนตัวผมเคยลองเล่นทั้ง Kitura กับ Vapor ก็คิดว่า ในปีหน้านี้ มันมาแน่ๆครับ

Platform / Service

  • Firebase
  • AWS
  • Realm
  • Heroku

ถ้าเอ่ยชื่อ  firebase แล้ว คนที่ทำ mobile ฝั่ง android น่าจะรู้จักดี แล้วก็ไม่ได้จำกัดแค่ใน android  นะ ใน iOS ก็ใช้ได้เหมือนกัน นอกจากนั้นก็มีอย่างอื่นให้ลองเล่นเช่น heroku หรือ aws , แม้ว่าสิ่งเหล่านี้จะดูเหมือนเป็น server side มากกว่า mobile แต่ผมว่าควรศึกษาไว้บ้างครับ

Others Useful tools

  • Slack
  • Brew
  • Postman
  • Docker
  • Shell ( Bash / Zsh )
  • git / svn

สำหรับนักศึกษา จบใหม่ อาจจะไม่เคยใช้ git/svn ก็ควรจะเรียนรู้มันโดยเร็วครับ แต่ถ้าคุณทำงานมา 1-2 ปีแล้วยังไม่รู้จัก git , svn นี่ผมว่าคุณเป็น dev ที่ใช้ไม่ได้ครับ  และปิดท้ายด้วย tools ที่ควรจะรู้ไว้บ้าง อย่างการใช้ shell command หรือว่า postman เป็นต้น และถ้าใครยังคุยงานโดยใช้ Line นี่ผมว่าควรเปลี่ยนไปใช้  slack ได้แล้วนะครับ

ในส่วนที่ผมไม่ได้เขียนถึง ก็คือพวก Library ต่างๆอย่าง Alamofire , Quick , SwiftyJSON อะไรแบบนั้น เพราะผมคิดว่า มันแบ่งออกย่อยเป็นหมวดหมู่เยอะมากมาย  ก็เลยไม่ได้เขียนไว้ ผมแนะนำให้ไปดูที่ https://github.com/Wolg/awesome-swift

และในส่วนของการเพิ่มพูนความรู้ ขอแนะนำให้อ่านหนังสือ พวกนี้ครับ

Book

  • Clean code a handbook of agile software craftsmanship ( Robert C. Martin)
  • Functional Swift: Updated for Swift 3 (Chris Eidhof)
  • Code Complete : A Practical Handbook of Software Constructoin ( Steve McConnell)
  • Advance Swift : Update for Swift 3 (by Chris Eidhof, Ole Begemann , Airspeed Velocity )

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

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

และขอบคุณทุกคนครับ ที่ตามอ่าน blog ของผมมาโดยตลอด
สุดท้ายนี้ ขอให้ ปี 2017 ที่จะมาถึง เป็นปีที่มีความสุขครับ Happy Coding 🙂

Swift 3 @escapeing & @nonescape closure

วันก่อนๆ ได้โหลด XCode 8 มาใช้งานซึ่งมันก็มาพร้อมกับ Swift3 แน่นอนว่า ภาษามันเปลี่ยนแปลงไป ไม่ว่าจะเป็น ชนิดของข้อมูลแบบใหม่ หรือว่า syntax ภาษาใหม่ๆ และหนึ่งในนั้นคือ closure

ถ้าหากเคยเขียน โคลเชอร์ ใน Swift2 มา ก็อาจจะเห็น คีย์เวิร์ด @nonescape ผ่านตามาบ้าง

ใน Swift2 พารามิเตอร์ที่เป็นโคลเชอร์จะมีค่าเริ่มต้นเป็น escape closure ถ้าหากเขียน @nonescape กำกับไว้ ก็จะเป็นการบอกว่า closure นี้เป็น nonescape  อย่างไรก็ตาม keyword นี้ได้นำออกไปจาก Swift 3 เป็นที่เรียบร้อย เนื่องจากว่า ใน Swift3 นี้ได้กำหนดไว้ว่า โคลเชอร์มีค่าเริ่มต้นเป็น nonescape

ถึงตรงนี้หลายคนอาจจะเกาหัว แล้วร้องว่า What ? เชี่ยยยย อะไรเนี่ย .. nonescape closure , escape closure มันคืออะไรว่ะ ?

ใจเย็นๆ แป๊ะอย่าร้อง ผมจะอธิบายให้ฟังแบบง่ายๆก็แล้วกัน

closure ที่ถูกส่งเข้าเป็นพารามิเตอร์ในฟังก์ชัน ถ้า closure ถูกเรียกหลังจากทีฟังก์ชันทำงานเสร็จได้ เรียกว่า escape closure

เพื่อให้เห็นภาพง่ายๆ ว่า escape  คืออะไรก็ดูตัวอย่างต่อไปนี้ละกัน

สมมติว่า ผมเขียนฟังก์ชัน download ไฟล์รูป ซึ่งเรียกใช้ฟังก์ชัน loadData  ของ http ที่เป็น asynchronous call ประมาณนี้

เมื่อฟังก์ชัน loadData ทำงานเสร็จ ก็จะเรียกโคลเชอร์ completion  พร้อมกับส่ง image กลับไป

การทำงานของ completion ลักษณะแบบนี้ จะเรียกว่า escape เพราะว่า มันทำงานได้ แม้ว่า ฟังก์ชัน loadProfileImage จะทำการ return (แต่ http.loadData จะยังทำงานต่อไป และแน่นอนว่า completion ก็จะถูกเรียกหลังจากที่ http.loadData ทำงานเสร็จ) สรุปคือว่า แม้ว่า loadProfile จะทำงานเสร็จ มันก็ยังเรียก completion

โค้ดตัวอย่างที่เขียนไป สามารถทำงานได้ปกติใน Swift 2 เพราะ โคลเชอร์ได้กำหนดให้เป็น escape มาตั้งแต่แรกเริ่ม ไม่ต้องเขียนอะไรเพิ่มเติมทั้งสิ้น

แต่ถ้าหาก เอาโค้ดนี้ไปใช้งานกับ swift 3 ตัว  completion จะไม่ถูกเรียก เนื่องจาก ฟังก์ชัน loadProfileImage จะทำการ return ก่อน ที่ฟังชัน loadData จะทำงานเสร็จ (เพราะเป็น asynchronous ไม่ต้องรอให้ทำงานเสร็จก็ return ได้)

เมื่อ @nonescape ได้นำออกไป มันก็ถูกแทนที่ด้วย  @escaping

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

ดังนั้นหากเราต้องการให้มันเรียก completion หลังจากที่ loadData ทำงานเสร็จ ก็ต้องกำหนดให้เป็น @escaping ดังชั่นตัวอย่าง

และจะเห็นว่า @escaping นั้นเป็น Type ประเภทหนึ่ง เช่นเดียวกับ String , Int ไม่ได้เป็น parameter attribute  เหมือนอย่างแต่ก่อน

ทำไมต้อง non escape ?

Swift3 เปลี่ยนมาใช้ non escape closure ก็เพราะเรื่องประสิทธิภาพ รวมไปถึงการจัดการหน่วยความจำ เนื่องจากว่า non escape นั้น จะไม่ทำการเก็บ closure ไว้  ปัญหา retain cycle ก็น้อยลงไป  ข้อดีอีกอย่างคือเราไม่ต้องเขียน self ถ้าหาก closure เรียกฟังก์ชันของตัวเอง

นอกจากนี้แล้ว การเขียน closure ใน Swift3 นั้นจะไม่สามารถกำหนด argument label ได้

ยกตัวอย่างเช่นใน Swift2 เราอาจจะเขียนฟังก์ชั่น แบบนี้

แต่ใน Swift 3 จะแจ้งว่า error

untitled-2

เพราะใน Swift3 นั้น closure ได้กำหนดว่า ไม่ให้มี argument label ดังนั้นแล้ว เราจึงต้องเพิ่ม _ เข้ามาในโค้ด ดังเช่นตัวอย่าง

ลองทำความเข้าใจ และศึกษา Swift3 , Closure กันครับ หวังว่าจะช่วยให้หลายคนเข้าใจ closure มากขึ้น

เขียนโปรแกรมกันเถิดจะเกิดผล Programming and technology