2016-08-22 38 views
14

Biz 8 beta 5 yüzden bu kullanılan bizim main.swiftXcode: main.swift derlenmeyecektir

import Foundation 
import UIKit 

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate)) 

ve o Xcode işe yaramadı, özel UIApplication nesne var Xcode 8 beta 6 günü

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

biz çözülmemiş tanımlayıcı 'Süreci'

ne UIApplicationMain tanımlamak için Xcode 8 beta 6/Swift 3'te yapmalıyım arasında Kullanımı olsun?

+0

UIApplication sınıfını bu şekilde nasıl belirlerim? –

cevap

31

ben bu şekilde geç

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

, UIApplication sınıfı değiştirmek formülasyonda nil için NSStringFromClass(MobileUIApplication.self) yerine belirleyin. buradan sadece amacı paylaşılan uygulama örneği olarak bir UIApplication alt sınıfı yerine ise

Ancak, daha kolay bir yolu var: Info.plist yılında, "Asıl sınıf" tuşuna eklemek ve değerini ayarlamak UIApplication alt sınıfınızın dize adı ve bu alt sınıfın bildirimini, aynı Objective-C adını veren bir @objc(...) özniteliği ile işaretleyin.

3

böyle bir şey yazmak gerekebilir, böylece Process beta 6.

CommandLine

yılında CommandLine olarak değiştirilmiştir Ama CommandLine.unsafeArgv tipi UIApplication ikinci argüman uyumsuzluğu gibi görünüyor:

CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in 
    _ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(MobileUIApplication.self), NSStringFromClass(AppDelegate.self)) 
} 

(UPDATE) Bu uyumsuzluk bir hata olarak değerlendirilmelidir. Genellikle, beta 5'te üçüncü parametre gibi "bu olmamalı" şeyleri bulduğunuzda bir bug report göndermeniz daha iyi olur. Umarım bu "hata" yakında giderilecektir. Eğer sadece özel UIApplication sınıfını belirlemek isterseniz


, neden Info.plist'ni kullanmıyorsun?

NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication 

(non-Raw Keys "Asıl sınıf" olarak gösterilen/Değerler görüntüleyin.) Bununla

sizin Info.plist içinde, sen @UIApplicationMain kullanarak normal bir şekilde birlikte MobileUIApplication kullanabilirsiniz. UIApplicationMain arasında

(ek) üstbilgi doc:

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no 
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init. 
+0

Lütfen bu durumun bir hata olarak kabul edildiğini unutmayın. Bu cevap, burada verilene çok az benzer: https://bugs.swift.org/browse/SR-1390?focusedCommentId=17441&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment -17441 – matt

+0

@matt, '' Process '' CommandLine' olarak yeniden adlandırıldığını söylemek hata raporu ile aynı değildir.Ancak, evet, görünüşe göre, cevabımdaki ana kod, hata için bir çözüm sunuyor ve parçayı güncelleyeceğim. IOS kullanırken – OOPer

+0

NSPrincipalClass alakası yoktur. Ama biz OP'yi kullanarak iOS'u kullanıyoruz ya da UIApplicationMain hakkında konuşmuyorduk. – matt