- การ@objcอนุมานคืออะไร? เกิดอะไรขึ้น?
ในSwift 3คอมไพเลอร์ infers @objcในหลายสถานที่ดังนั้นคุณไม่จำเป็นต้อง กล่าวอีกนัยหนึ่งมันทำให้แน่ใจว่าจะเพิ่ม@objcให้คุณ!
ในSwift 4คอมไพเลอร์ไม่ทำเช่นนี้ (มาก) ตอนนี้คุณต้องเพิ่ม@objcอย่างชัดเจน
หากคุณมีโครงการ pre-Swift 4 คุณจะได้รับคำเตือนเกี่ยวกับสิ่งนี้ ในโครงการ Swift 4 คุณจะได้รับข้อผิดพลาดในการสร้าง สิ่งนี้ถูกควบคุมผ่านการSWIFT_SWIFT3_OBJC_INFERENCEตั้งค่าการสร้าง ใน 4 โครงการก่อน Swift Onนี้ถูกตั้งค่า ฉันอยากจะแนะนำให้ตั้งค่านี้เป็นDefault(หรือOff) ซึ่งตอนนี้เป็นตัวเลือกเริ่มต้นในโครงการใหม่
ต้องใช้เวลาพอสมควรในการแปลงทุกอย่าง แต่เนื่องจากเป็นค่าเริ่มต้นสำหรับ Swift 4 จึงคุ้มค่าที่จะทำ
- ฉันจะหยุดคำเตือน / ข้อผิดพลาดของคอมไพเลอร์ได้อย่างไร
มีสองวิธีในการแปลงโค้ดของคุณเพื่อให้คอมไพเลอร์ไม่บ่น
หนึ่งคือการใช้งาน@objcในแต่ละฟังก์ชั่นหรือตัวแปรที่จำเป็นต้องสัมผัสกับรันไทม์ Objective-C:
@objc func foo() {
}
อื่น ๆ คือการใช้@objcMembersโดยการClassประกาศ นี้จะทำให้แน่ใจว่าจะเพิ่มโดยอัตโนมัติ@objcไปยังทุกฟังก์ชั่นและตัวแปรในชั้นเรียน นี่เป็นวิธีที่ง่าย แต่มีค่าใช้จ่ายตัวอย่างเช่นมันสามารถเพิ่มขนาดของแอปพลิเคชันของคุณโดยการแสดงฟังก์ชั่นที่ไม่จำเป็นต้องเปิดเผย
@objcMembers class Test {
}
- อะไรคืออะไร@objcและทำไมจึงจำเป็น
หากคุณแนะนำวิธีการหรือตัวแปรใหม่ให้กับคลาส Swift การทำเครื่องหมายพวกเขาเป็นการ@objcเปิดเผยพวกมันไปยังรันไทม์ Objective-C นี้เป็นสิ่งจำเป็นเมื่อคุณมีรหัส Objective-C ที่ใช้ระดับสวิฟท์ของคุณหรือถ้าคุณกำลังใช้ SelectorsObjective-C-ประเภทคุณสมบัติเช่น ตัวอย่างเช่นรูปแบบการดำเนินการเป้าหมาย:
button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- ทำไมฉันจะไม่ทำเครื่องหมายทุกอย่าง@objc?
มีเชิงลบที่มาพร้อมกับการทำเครื่องหมายบางอย่างเป็น@objc:
- แอปพลิเคชันที่เพิ่มขึ้นขนาดไบนารี
- ไม่มีฟังก์ชั่นโอเวอร์โหลด
โปรดทราบว่านี่เป็นบทสรุประดับสูงมากและมันซับซ้อนกว่าที่ฉันเขียน ฉันขอแนะนำให้อ่านข้อเสนอจริงสำหรับข้อมูลเพิ่มเติม
แหล่งที่มา: