web-dev-qa-db-ja.com

宣言されていないタイプ 'AppDelegate'の使用Swift

次の問題を解決するために半日過ごしました。私はSwift言語を使用してCoreDataをテストしています。 this チュートリアルに従ってくださいすべてが正常に動作します。

しかし、チュートリアルの後、私は structure と私のコードを変更しようとしました。 「src」とその中のグループはフォルダであり、xCodeによって作成されたグループだけではありません。

NSSExpense.Swift

import Foundation
import CoreData

class NSSExpense: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var descr: String
    @NSManaged var value: NSNumber
    @NSManaged var isMonthly: NSNumber
    @NSManaged var payDayInMonth: NSNumber

    class func createInManagedObjectContext(moc: NSManagedObjectContext, name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
        let newExpense = NSEntityDescription.insertNewObjectForEntityForName("NSSExpense", inManagedObjectContext: moc) as NSSExpense

        newExpense.name = name
        newExpense.value = NSNumber(double: value)
        newExpense.payDayInMonth = NSNumber(short: payDayInMonth)
        newExpense.isMonthly = NSNumber(bool: isMonthly)

        if let expenseDesctiption = descr {
            newExpense.descr = expenseDesctiption
        } else {
            newExpense.descr = ""
        }

        return newExpense
    }
}

NSSDataManager.Swift

import UIKit
import CoreData

class NSSDataManager: NSObject {

    class var sharedDataManager: NSSDataManager {
        struct Static {
            static var instance: NSSDataManager?
            static var token: dispatch_once_t = 0
        }

        dispatch_once(&Static.token) {
            Static.instance = NSSDataManager()
        }

        return Static.instance!
    }

    lazy var managedObjectContext : NSManagedObjectContext? = {
        // Error at the next line "Use of undeclared type 'NSSAppDelegate'"
        let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate

        if let managedObjectContext = appDelegate.managedObjectContext {
            return managedObjectContext
        } else {
            return nil
        }
    }()

    var expensesInMemory : [NSSExpense] {
        get {
            let fetchRequest = NSFetchRequest(entityName: "NSSExpense")
            if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSSExpense] {
                return fetchResults
            } else {
                return [NSSExpense]()
            }
        }
    }

    func addExpenseWithName(name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
        return NSSExpense.createInManagedObjectContext(managedObjectContext!, name: name, value: value, payDayInMonth: payDayInMonth, isMonthly: isMonthly, descr: descr?)
    }

}

私はこの問題をさまざまな方法で解決しようとしました:1)新しいプロジェクト(Swiftメイン言語)を作成し、同じ構造を再度作成します(失敗)2)新しいプロジェクト(Objective-Cメイン言語)を作成します。したがって、AppDelegate.hとAppDelegate.mがあります。 Swift Bridging-Headerを使用してファイルに追加します。同じ問題が発生します(失敗))

次は本当に面白い。新しいプロジェクトで自動的に作成されるViewController.Swiftに次のコードを追加すると、すべてが正常に機能します。しかし、このコードを他のクラスに配置すると、このエラーをコーディングしました。

lazy var managedObjectContext : NSManagedObjectContext? = {
        // Error at the next line "Use of undeclared type 'NSSAppDelegate'"
        let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate

        if let managedObjectContext = appDelegate.managedObjectContext {
            return managedObjectContext
        } else {
            return nil
        }
    }()

[更新1]

NSSAppDelegate.Swiftと同じフォルダーに別のクラスを作成しようとしましたが、すべて正常に機能します。それでも問題はありますが、他のフォルダに保存されているクラスをどのように使用できますか?


[更新2]

他のプロジェクトで同じことをやろうとしただけです。ファイル構造が this の場合、AppDelegate.SwiftとNGDataManager.Swiftは同じフォルダーにあり、すべてがうまく機能します。しかし、NGDataManager.Swiftを this (グループ、フォルダーだけでなく)のように 'src'フォルダー内に配置すると、 error が発生します。これについて他の質問を作成する必要があるかもしれません。


[更新3]

方法はわかりませんが、私がUDATE 2で言ったことはすべて忘れることができます。 「Test」という名前のCoreDataで新しいプロジェクトを作成し、「TestClass」という名前の新しいクラスを作成するだけです。魔法は次のことです:このコードをTestClass.Swift内に配置した場合

import UIKit

class TestClass: NSObject {
    func someFunc() {
        let appDel = UIApplication.sharedApplication().delegate as AppDelegate
    }
}

エラーが発生します。しかし、このコードを、xCodeによって自動的に生成されたViewController.SwiftのviewDidLoadに配置すると

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let appDel = UIApplication.sharedApplication().delegate as AppDelegate
    }
}

エラーはなく、すべてが正常に動作します。なんて言ったらいいのかわからない….

AppDelegateコード here が表示される場合がありますが、xCodeによって自動的に生成されたものは変更していません。 this 設定のシングルビューアプリケーションを作成しました。

14
Doshipak

プロジェクトを作成したときに、 '{ProjectName} Tests'ターゲットも作成した可能性があります。問題は、AppDelegateに '{ProjectName} Tests'ターゲットのメンバーシップが割り当てられていないことです。

AppDelegate.Swiftを選択し、右側のインスペクターで[ファイルインスペクター](紙のアイコン)をクリックして、[ターゲットメンバーシップ]でプロジェクトとテストターゲットのチェックマークが両方ともオンになっていることを確認します。

クリーン、リビルド。

54
Ramin

SwiftコードでObjective-C AppDelegateにアクセスする場合は、#import "AppDelegate.h"をブリッジヘッダーファイルに追加します。

これは私が約1時間スタックしていた:-/

18
Hodson

製品メニューで「クリーン」オプションを実行したときに解決された同様の問題がありました

4
Syed Tariq

Xcode 8でこの問題に遭遇し、これが私がgoogleで検索したときの最初の結果なので、私のソリューションを追加しました。

プロジェクトにUIと単体テストがある場合は、AppDelegateが両方のターゲットメンバーシップに追加されていることを確認してください。テストに追加すると、ファイルのグループ化方法に関係なく、UIApplication.sharedを使用しなくても、AppDelegateにあるすべての変数にアクセスできました。

確認するには、AppDelegateに移動し、ファイルインスペクタをクリックして、Target Membershipを確認します。

3

こうなると思います。

let appDelegate: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
2
Mohammad Nurdin

ターゲットメンバーシップが各ファイルで同じに設定されていることを確認します。特定のファイルをクリックすると、ターゲットメンバーシップがプロパティインスペクターに表示されます。

2
Jon Vogel

の代わりに:

let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate

試してください:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
0
Magnas