Stati c member 'load' не может использоваться в экземпляре типа 'AppDelegate' - PullRequest
0 голосов
/ 02 марта 2020

Может кто-нибудь объяснить, почему я не могу использовать пользовательскую функцию load в моем application(_, didFinishLaunchingWithOptions:)?

Я получаю сообщение об ошибке:

Stati c member 'load 'нельзя использовать в экземпляре типа' AppDelegate '

Когда я переименовываю функцию, например, в func loader(...) и вызываю ее с помощью loader("data.json"), она работает как положено. Разве XCode не распознает правильно, что я использую пользовательскую функцию с именем load вместо функции NSObject.load() здесь? Я знаю, что могу просто переименовать функцию, но я хотел бы понять причину root.

AppeDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var data: Maturity? = nil

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        data = load("data.json") // Static member 'load' cannot be used on instance of type 'AppDelegate'
        return true
    }
    ...
}

Data.swift

import Foundation

func load<T: Decodable>(_ filename: String) -> T {
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
        else {
            fatalError("Couldn't find \(filename) in main bundle.")
    }

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}

1 Ответ

3 голосов
/ 02 марта 2020

Swift всегда вызывает наиболее конкретную c перегруженную версию функции, если несколько могут быть вызваны с одинаковыми параметрами.

В вашем конкретном c случае это означает, что будет вызван метод экземпляра а не глобальная функция, поскольку метод экземпляра более специфичен c для этого типа, чем глобальная функция.

...