- การ@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 ที่ใช้ระดับสวิฟท์ของคุณหรือถ้าคุณกำลังใช้ Selectors
Objective-C-ประเภทคุณสมบัติเช่น ตัวอย่างเช่นรูปแบบการดำเนินการเป้าหมาย:
button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- ทำไมฉันจะไม่ทำเครื่องหมายทุกอย่าง@objc
?
มีเชิงลบที่มาพร้อมกับการทำเครื่องหมายบางอย่างเป็น@objc
:
- แอปพลิเคชันที่เพิ่มขึ้นขนาดไบนารี
- ไม่มีฟังก์ชั่นโอเวอร์โหลด
โปรดทราบว่านี่เป็นบทสรุประดับสูงมากและมันซับซ้อนกว่าที่ฉันเขียน ฉันขอแนะนำให้อ่านข้อเสนอจริงสำหรับข้อมูลเพิ่มเติม
แหล่งที่มา: