ใน Swift ฉันสามารถตั้งค่าประเภทของตัวแปรอย่างชัดเจนโดยการประกาศดังต่อไปนี้:
var object: TYPE_NAME
หากเราต้องการก้าวไปอีกขั้นและประกาศตัวแปรที่สอดคล้องกับโปรโตคอลหลายตัวเราสามารถใช้การprotocol
ประกาศ:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
จะเป็นอย่างไรหากฉันต้องการประกาศอ็อบเจ็กต์ที่เป็นไปตามโปรโตคอลตั้งแต่หนึ่งโปรโตคอลขึ้นไปและเป็นประเภทคลาสพื้นฐานที่เฉพาะเจาะจง Objective-C ที่เทียบเท่าจะมีลักษณะดังนี้:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
ใน Swift ฉันคาดหวังว่ามันจะมีลักษณะเช่นนี้:
var object: TYPE_NAME,ProtocolOne//etc
สิ่งนี้ทำให้เรามีความยืดหยุ่นในการจัดการกับการใช้งานประเภทพื้นฐานตลอดจนอินเทอร์เฟซเพิ่มเติมที่กำหนดไว้ในโปรโตคอล
มีวิธีอื่นที่ชัดเจนกว่าที่ฉันอาจพลาดไปหรือไม่?
ตัวอย่าง
ตัวอย่างเช่นสมมติว่าฉันมีUITableViewCell
โรงงานที่รับผิดชอบในการส่งคืนเซลล์ที่เป็นไปตามโปรโตคอล เราสามารถตั้งค่าฟังก์ชันทั่วไปที่ส่งคืนเซลล์ที่เป็นไปตามโปรโตคอลได้อย่างง่ายดาย:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
ในภายหลังฉันต้องการยกเลิกการจัดคิวเซลล์เหล่านี้ในขณะที่ใช้ประโยชน์จากทั้งชนิดและโปรโตคอล
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
สิ่งนี้ส่งคืนข้อผิดพลาดเนื่องจากเซลล์มุมมองตารางไม่เป็นไปตามโปรโตคอล ...
ฉันต้องการที่จะระบุว่าเซลล์นั้นเป็น a UITableViewCell
และสอดคล้องกับMyProtocol
ในการประกาศตัวแปรหรือไม่
เหตุผล
หากคุณคุ้นเคยกับFactory Patternสิ่งนี้จะสมเหตุสมผลในบริบทของความสามารถในการส่งคืนอ็อบเจ็กต์ของคลาสเฉพาะที่ใช้อินเทอร์เฟซบางอย่าง
เช่นเดียวกับในตัวอย่างของฉันบางครั้งเราต้องการกำหนดอินเทอร์เฟซที่เหมาะสมเมื่อนำไปใช้กับวัตถุหนึ่ง ๆ ตัวอย่างเซลล์มุมมองตารางของฉันเป็นเหตุผลอย่างหนึ่ง
ในขณะที่ประเภทที่ให้มาไม่สอดคล้องกับอินเทอร์เฟซที่กล่าวถึงอย่างแน่นอน แต่อ็อบเจ็กต์ที่โรงงานกลับมาทำดังนั้นฉันต้องการความยืดหยุ่นในการโต้ตอบกับทั้งประเภทคลาสฐานและอินเทอร์เฟซโปรโตคอลที่ประกาศ