Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xcode 8 beta 6: main.swift won't compile

Tags:

We have a custom UIApplication object, so our main.swift was

import Foundation import UIKit  UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate)) 

and that didn't work in Xcode 8 beta 5 so we used this

//TODO Swift 3 workaround? https://forums.developer.apple.com/thread/46405 UIApplicationMain( Process.argc, UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv), nil, NSStringFromClass(AppDelegate.self)) 

On Xcode 8 beta 6 we get Use of unresolved identifier 'Process'

What do we need to do in Xcode 8 beta 6/Swift 3 to define the UIApplicationMain?

like image 207
Jason Hocker Avatar asked Aug 22 '16 21:08

Jason Hocker


1 Answers

I write it this way:

UIApplicationMain(     CommandLine.argc,     UnsafeMutableRawPointer(CommandLine.unsafeArgv)         .bindMemory(             to: UnsafeMutablePointer<Int8>.self,             capacity: Int(CommandLine.argc)),     nil,     NSStringFromClass(AppDelegate.self) ) 

To change the UIApplication class, substitute NSStringFromClass(MobileUIApplication.self) for nil in that formulation.

However, if your only purpose here is to substitute a UIApplication subclass as the shared application instance, there's an easier way: in the Info.plist, add the "Principal class" key and set its value to the string name of your UIApplication subclass, and mark your declaration of that subclass with an @objc(...) attribute giving it the same Objective-C name.

EDIT This problem is now solved in Swift 4.2. CommandLine.unsafeArgv now has the correct signature, and one can call UIApplicationMain easily:

UIApplicationMain(     CommandLine.argc, CommandLine.unsafeArgv,      nil, NSStringFromClass(AppDelegate.self) ) 
like image 67
matt Avatar answered Sep 26 '22 17:09

matt