Initialization คือกระบวนการเตรียม instance ให้พร้อมใช้ของ class, structure หรือ enumeration กระบวนการนี้รวมไปถึง การกำหนดค่าเริ่มต้น properties ของ instance ไปถึงการเตรียมความพร้อมของค่าต่างๆ ที่จำเป็นก่อนที่ instance นี้จะพร้อมสำหรับใช้งาน
Initializers คือ method ที่ถูกเรียกเพื่อจะสร้าง instance ใหม่ เราประกาศโดยใช้คีย์เวิรด์ init
ตัวอย่างการใช้
struct TrackInfo{
var currentTime:Int
init(){
currentTime = 0
}
}
จากตัวอย่าง structure มี properties อยู่ตัวเดียวคือ currentTime และมี initializer โดยไม่รับ parameter ใดๆ เข้ามาเลย โดยภายในจะทำหน้าที่เซตค่าตั้งต้นให้กับตัวแปร currentTime
แต่เราสามารถจะเซตค่าตั้งต้นให้กับตัวแปร currentTime จากวิธีเบื้องต้น หรือเซตค่าตั้งต้นให้ตัวแปรนี้จากตอนประกาศตัวแปรเลยก็ได้ ดังนี้
struct TrackInfo{
var currentTime:Int = 0
}
Cuztomizing initialization
เราสามารถปรับแต่งการ init ด้วยการเพิ่มตัวแปรไปในระหว่างการ init ,ใช้ optional property type หรือด้วยการกำหนดค่าคงที่
Initialization Parameters
เราสามารถให้ข้อมูลของ ตัวแปรตั้งต้น(Initialization Parameters) ให้เป็นส่วนหนึ่งในการ init โดยทำการกำหนดประเภทข้อมูล และชื่อของข้อมูลลงไป ซึ่งการกำหนดแบบนี้คล้ายกับ method parameter ของฟังก์ชัน
struct Height{
var heightInCentimetre:Double
init(fromMetre metre:Double){
heightInCentimetre = metre * 100
}
init(fromInch inch:Double){
heightInCentimetre = inch * 2.54
}
}
โดย initializer ตัวแรก จะทำการ init ค่าจะรับค่าโดยใช้ external name(ใช้สำหรับเรียกตัวแปรนี้จากภายในฟังก์ชัน) เป็น fromMetre และ local name(ใช้สำหรับเรียกตัวแปรนี้จากภายในฟังก์ชัน) เป็น metre โดยจะรับข้อมูลซึ่งมีหน่วยเป็นเมตรเข้ามา จากนั้นจะทำการคำนวณข้อมูลดังกล่าวและแปลงให้เป็นหน่วย เซนติเมตร แล้วทำการกำหนดค่าตั้งต้นดังกล่าวให้ตัวแปรซึ่งเก็บความสูงเป็นหน่วยเซนติเมตร
ส่วน init ตัวที่สองจะรับค่าโดยตัวแปร external เป็น fromInch และ local name เป็น inch จากนั้นจะทำการคำนวณค่าความสูงจากหน่วยนิ้วให้เป็นหน่วยเซนติเมตรและจากนั้นจึงทำการกำหนดค่าให้กับตัวแปร
Optional Property types
ถ้า custom type ของเรามี store property ที่อนุญาติให้มีการกำหนดค่า “ไม่มีค่า” เช่น ค่านั้นไม่สามารถถูกเซตในระหว่างการกระบวนการเซตค่าเริ่มต้น หรืออาจเพราะเราอนุญาติให้กำหนดค่า “ไม่มีค่า” ได้ทีหลัง เราควรจะประกาศตัวแปรนั้นให้เป็นชนิด optional โดย properties ที่ถูกกำหนดให้เป็น optional นั้นจะถูกกำหนดให้เป็น nil อัตโนมัติซึ่งจะหมายถึงว่า เราต้องการบอกโปรแกรมว่า ยังไม่ได้กำหนดค่า ในระหว่างกำหนดค่าเริ่มต้น
ตัวอย่างเช่น
class User{
var userID : String
var userName : String
var userTel :String?
var userEmail : String?
init(id:String, name:String){
self.userID = id
self.userName = name
}
func printText(){
print("Username: \(self.userName)")
if self.userTel != nil {
print("Tel: \(self.userTel!)")
}else if self.userEmail != nil {
print("Email: \(self.userEmail!)")
}
}
}
let newUser = User(id: "123", name: "Peter" )
newUser.userTel = "0123456789"
newUser.printText()
จากตัวอย่างข้างต้น คุณลักษณะ(property) userID และ userName เราต้องการกำหนดค่าตั้งแต่กระบวนการการกำหนดค่าตั้งต้น(init) เราจึงสามารถทำการกำหนดแบบปกติได้ แต่คุณลักษณะ userTel และ userEmail ซึ่งเป็นข้อมูลที่จะระบุหรือไม่ระบุก็ได้ เราจึงทำการกำหนดให้เป็นข้อมูลชนิด optional ซึ่งจะมีค่า หรือไม่มีก็ได้โดยค่าตั้งต้นจะเป็น nil และสังเกตุว่าในฟังก์ชัน printText เราสามารถจะเปรียบเทียบข้อมูล optional กับค่าว่างได้เพื่อทำการตรวจสอบ ตัวแปรประเภท optional นี้ก่อนใช้งานค่านั้นๆ เราต้องทำการ ดึงค่าออกมา(unwrap) ก่อนโดยใช้สัญลักษณ์ self.userEmail! เพื่อทำการเอาค่าจริงออกมาใช้งาน
Default Initializer
สำหรับ structure หรือ class ที่ได้ทำการกำหนดค่าสำหรับคุณลักษณะ(properties)ทั้งหมดไว้แล้ว default initializer จะทำการสร้าง instance ใหม่ให้อัตโนมิต พร้อมกับการระบุด้วยคุณลักษณะทั้งหมดไว้ให้ตามที่ระบุไว้
class Product{
var name : String?
var cost = 0.0
var sellStatus = false
}
let newProduct = Product()
จากตัวอย่าง จะทำการสร้าง instance ใหม่ขึ้นมาให้ พร้อมด้วยคุณลักษณะ name ซึ่งกำหนดค่าเบื้องต้นเป็น nil เพราะเราทำการกำหนดตัวแปรนี้ไว้เป็น optional, cost มีค่าเป็น 0.0 มีชนิด double และ status มีค่าเป็น boolean ซึ่งมีค่าเป็น false
Memberwise Initializer for structure
สำหรับ structure ถ้าเราไม่ทำการสร้าง custom initializer ใดๆ ไว้เลย swift สร้าง initializer ให้ตัวนึงโดยอัตโนมัติ โดยทำการรับค่าคุณลักษณะทั้งหมดเข้าไปกำหนดค่าตั้งต้น และแต่ละตัวแปรกำหนดโดยชื่อตัวแปรนั้นๆ ตัวอย่างเช่น
struct Rect {
var x = 0.0
var y = 0.0
var width = 0.0
var height = 0.0
}
let rect = Rect(x: 0.0, y: 0.0, width: 480, height: 460)
จากตัวอย่างข้างต้นจะเห็นว่า เราไม่ได้สร้าง custom initializer ใดๆไว้เลย ดังนั้น swift เลยสร้างให้เราอัตโนมัติ โดยการรับค่าตัวแปรทั้งหมดของ structure นั้นด้วยการส่งค่า x, y, width, height
Initializer Delegation สำหรับ Value Types
initializers สามารถทำการเรียก initializer อื่นๆ เพื่อทำการจัดการกับค่าตั้งต้นของแต่ละ instance เราเรียกกระบวนการนี้ว่า ‘Initializer delegation’
