โปรดทราบว่าไวยากรณ์ได้รับการอัปเดตสำหรับ XCode 10.1 และ Swift 5 ในเดือนมิถุนายน 2019 (ให้เครดิตสำหรับคำตอบของ Matt ที่นี่ && Tung Fam ที่นี่ ) หากคุณกำลังมองหาไวยากรณ์ก่อนหน้าให้ดูที่ส่วนแก้ไข
โอเคฉันพบวิธีแก้ปัญหาแล้ว
อันดับแรกฉันสังเกตว่าที่ด้านบนของไฟล์ AppDelegate.swift มีบรรทัดนี้
@UIApplicationMain
เนื่องจากบรรทัดนี้อยู่นอกขอบเขตใด ๆ (อยู่ในระดับไฟล์) จึงดำเนินการทันทีและฉันถือว่าคอมไพเลอร์แปลในฟังก์ชันหลักมาตรฐาน
ดังนั้นฉันจึงทำสิ่งนี้โดยเริ่มจากแอปพลิเคชัน Swift-Only ใหม่:
- แสดงความคิดเห็น
@UIApplicationMain
- เพิ่มไฟล์ main.swift แบบนี้ (FLApplication คือคลาสย่อยของฉัน)
สิ่งสำคัญไฟล์ต้องตั้งชื่อ main.swift เนื่องจากไฟล์อื่นไม่รองรับข้อความระดับบนสุด! คุณไม่สามารถเพิ่มการเรียก UIApplicationMain () ภายในไฟล์อื่นได้มิฉะนั้นคุณจะได้รับข้อผิดพลาดนี้:
ไม่อนุญาตให้ใช้นิพจน์ที่ระดับบนสุด
นี่คือไฟล์ main.swift
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)
จากนั้นสร้างไฟล์ที่รวดเร็วสำหรับคลาสย่อย UIApplication FLApplication.swift ด้วยรหัสนี้:
import UIKit
import Foundation
class FLApplication: UIApplication {
override func sendEvent(_ event: UIEvent) {
super.sendEvent(event)
print("send event")
}
}
ตอนนี้ UIApplication ได้รับการแบ่งคลาสย่อยอย่างถูกต้องแล้วคุณจะเห็นข้อความ "ส่งเหตุการณ์" ในบันทึก
การแก้ไขเก่า
สำหรับการอ้างอิงเนื่องจากสิ่งนี้เปลี่ยนไปมากจากเวอร์ชัน 1 เป็นเวอร์ชัน 3 ฉันจึงปล่อยการแก้ไขก่อนหน้านี้ทั้งหมดไว้ที่นี่
แก้ไข - มีนาคม 2558
ตามความเห็นของ Hu Junfeng ตอนนี้คำอธิบายเกี่ยวกับUIApplicationMain
และไฟล์ main.swift ได้รับการบันทึกไว้ในส่วนแอตทริบิวต์ของการอ้างอิงภาษา Swift: ลิงก์
ตามความเห็นของ Thomas Verbeek ใน XCode 6.3 Beta คุณอาจพบว่า C_ARGC และ C_ARGV ถูกเปลี่ยนชื่อเป็น Process.argc และ Process.unsafeArgv ตามลำดับ การเรียก UIApplicationMain ของคุณในไฟล์ main.swift จะต้องอัปเดตเป็น:
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
ไวยากรณ์ก่อน XCode 8 คือ
import Foundation
import UIKit
UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
แก้ไข - ธันวาคม 2559
โซลูชันสำหรับ Xcode 8 ก่อนเบต้า 6
import Foundation
import UIKit
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(FLApplication.self),
NSStringFromClass(AppDelegate.self)
)
UIApplicationMain()
พารามิเตอร์เพิ่มชื่อคลาสด้านล่างNSPrincipalClass
ใน app-info.plist