iOS Tutorial – Begin with swift ( day 8 ) – Properties

swift-128x128

รู้จักกับ properties

properties คือค่าที่ถูกเก็บและเป็นส่วนหนึ่ง class, structure และ enumeration

  • store properties คือ ค่าคงที่ หรือตัวแปรที่ที่ถูกบันทึก ซึ่งจะหาได้ใน class, structure
  • compute properties คือ ค่าที่ถูกคำนวณขึ้น ซึ่งจะหาได้ใน class, structure, enumeration

store properties

store properties สามารถจะประกาศเป็น ค่าคงที่(ประกาศด้วย let) หรือตัวแปร (ประกาศด้วย var) ก็ได้

ตัวอย่างการใช้ store properties

struct TrackInfo{
    var length:Int
    var currentTime:Int
}

จากตัวอย่าง เราทำการสร้าง Structure ชื่อ TrackInfo สำหรับไว้ทำการบันทึกข้อมูลรายละเอียดของเพลงแต่ละเพลง โดยเราทำการประกาศ ตัวแปร properties ชื่อว่า length ซึ่งไว้บันทึกความยาวของเพลงนั้นและ currentTime ไว้สำหรับบันทึกวินาที ที่เพลงนั้นกำลังเล่นอยู่

lazy properties

เป็น properties ตัวหนึ่งที่ ค่าตั้งต้นจะไม่ถูกคำนวณจนกระทั่งครั้งแรกที่ค่าถูกเรียกใช้ เราเรียกใช้ properties ชนิดนี้โดยการประกาศ keyword “lazy” หน้าการประกาศนั้นๆ

class TrackReader{
    var filename = "abc.mp3"
    var trackInfo:TrackInfo = TrackInfo(length: 0, currentTime: 0)
    // To read track from file
}

class TrackPlayer{
    lazy var track = TrackReader()
    var data = [String]()
    // To create player
    // At this point TrackRead has not been load
}

var player = TrackPlayer();
player.data.append("Related info here")    
// จนถึงตรงนี้ track ยังไม่ถูกเรียกใช้จึงยังไม่มีการกำหนดค่าตั้งต้นใดๆ ขึ้น
print(player.track.filename)     // เริ่มมีการกำหนดค่าตั้งต้นให้ track

compute properties

จะไม่เก็บค่าจริงไว้ แต่ค่าตั้งต้นที่ได้ มาจากการคำนวณค่าด้วยวิธีที่กำหนด

ตัวอย่างการใช้

struct TrackInfo{
    var length:Int
    var currentTime:Int
    var remainingTime:Int{
        get{
            return length - currentTime
        }
        set(newValue){
            currentTime = length - newValue
        }
       
    }
}

จากตัวอย่างข้างต้น เป็นการเก็บข้อมูลของแต่ละ track โดย remainingTime จะทำการเก็บข้อมูลเวลาที่เหลืออยู่ของเพลงๆ นี้และเป็นค่าที่ได้จากการคำนวณระหว่าง เวลาทั้งหมดในเพลง-เวลาปัจจุบันที่เพลงเล่นอยู่  ซึ่งจะเปลี่ยนแปลงไปเรื่อยๆขึ้นอยู่กับว่า ตอนนี้เพลงกำลังเล่นอยู่ที่วินาทีใด การใช้ computed properties เราจะมีการประกาศฟังก์ชัน get/set ไว้เพื่อเรียกใช้ค่า และกำหนดค่าให้กับ properties นั้น จะเห็นว่าเรามีฟังก์ชัน get ที่ทำการส่งคืนผลการคำนวณระหว่าง เวลาทั้งหมด และ เวลาปัจจุบัน สำหรับค่า remainingTime และหากเราการกำหนดค่า remainingTime ลงไปโปรแกรมจะทำการคำนวณค่า currentTime ใหม่ สำหรับการใช้ set ฟังก์ชัน ถ้าเราไม่ทำการกำหนดชื่อตัวแปรลงไปใน swift เองจะกำหนดชื่อตัวแปรอัตโนมัติมาให้ชือว่า newValue

Property Observer

property observer จะคอยดักเหตุการณ์ที่จะก่อนขึ้นกับ properties นั้นทั้งก่อนและหลังการเปลี่ยนแปลง

  • willSet จะถูกเรียกก่อนค่าจะเปลี่ยนแปลง
  • didSet จะถูกเรียกหลังค่าเปลี่ยนแปลง

ตัวอย่างการใช้

struct TrackInfo{
    var length:Int
    var currentTime:Int {
        
        willSet(newValue) {
            print("About to change currentTime \(newValue)")
        }
        didSet {
            if currentTime > oldValue  {
                print("Time change \(abs(currentTime - oldValue)) seconds")
            }
        }
    }
    var remainingTime:Int{
        get{
            return length - currentTime
        }
        set(newValue){
            currentTime = length - newValue
        }
    }
}

var trackInfo = TrackInfo( length:90, currentTime:30)
trackInfo.currentTime = 50

จากตัวอย่างเป็นการดักจับเหตุการณ์ที่จะทำการเปลี่ยนแปลงค่า currentTime เมื่อกำลังจะทำการเปลี่ยนแปลงค่าเราดักจับเหตุการณ์โดยใช้ willSet เราสามารถจะกำหนดชื่อตัวแปรที่เราจะรับค่ามาตรวจสอบได้ แต่ถ้าหากเราไม่ทำการกำหนดชื่อตัวแปร swift จะใช้ชื่อตั้งต้นคือ newValue  และเมื่อเราทำการเซตค่าแล้ว เราจะดักจับเหตุการณ์โดยใช้ didSet โดยจะสามารถเรียกดูค่าเก่าก่อนที่เราจะทำการเปลี่ยนแปลงค่าได้ผ่านตัวแปรชื่อ oldValue

ตัวอย่างข้างต้น เราทำการกำหนดค่าเริ่มต้นให้ trackInfo โดยเพลงมีความยาว 90 วินาที และเวลาปัจจุบันที่วินาทีที่ 30 จากนั้นเรามีการกำหนดค่าเวลาของเพลงปัจจุบันให้ไปอยู่ที่วินาทีที่ 50

ผลจากการดักจับเหตุการณ์จะเป็นดังนี้

About to change currentTime 40
Time change 30 seconds

อ่านเพิ่มเติม ที่นี่