Подтвердить что ты не робот

Невозможно вызвать значение нефункционного типа 'String'

Я пытаюсь передать переменную ILTItem в свой ILTViewController, вызванный AppDelegate.swift, когда пользователь запускает мое приложение через deeplink.

В коде есть ошибки с:

Невозможно вызвать значение нефункционного типа 'String'

в строке, где я определяю ilt.

Вот код, который у меня есть на данный момент:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var ilt = ILT(homeworkID: 1234, title: "History ILT", subject: "History", teacher: "Miss A Smith", teacherCode: "asmith", studentID: 12345, description: "Description....", due: 1450137600, status: "In Progress", hasAttachments: true)
var newVC = ILTViewController()
newVC.ILTitem = ilt
appDelegate.window?.addSubview(newVC.view)

Почему это может быть? В моем классе ILTViewController у меня есть:

class ILTViewController: UIViewController {
  // accept the incoming ILT struct
  var ILTitem: ILT!

Декларация IlT Struct:

struct ILT {
    let homeworkID: Int
    let title: String
    let subject: String
    let teacher: String
    let teacherCode: String
    let studentID: Int
    let description: String
    let due: Double
    let status: String
    let hasAttachments: Bool
}
4b9b3361

Ответ 1

Ошибка говорит вам, что вы пытаетесь вызвать String вместо метода (конструктор структуры в вашем случае). Вероятно, вы указали переменную String с именем ILT (в верхнем регистре) где-то еще и почему она не работает.

Ваш опубликованный код отлично работает, поэтому ошибка должна быть где-то еще в вашем коде.

Ответ 2

Включите оператор let, если:

if let xxx = yyy {
   ... do something
}

Ответ 3

let works = ["foo", "bar"].first(where: { ($0 == "foo") } )
let works = ["foo", "bar"].first(where: { (_ in true) } )

против

// Cannot call value of a non-function type 'String?'

let fails = ["foo", "bar"].first(where: { (true) } )

Вы должны быть уверены, что используйте параметр ($0 или _ in) в выражении закрытия.

Используйте _ in или $0 для сброса или ссылки на параметр. Вы не можете просто перемещаться непосредственно в тело закрытия и возвращать true, или вы получите эту (крайне бесполезную) ошибку.

Ответ 4

Имел аналогичную проблему в этом коде

array.first { $0 == item }

Проблема заключалась в том, что $0 не соответствует протоколу Equatable. В моем случае это соответствовало NSObjectProtocol, и простого сравнения указателей было достаточно, поэтому я исправил проблему с помощью

array.first { $0 === item }

Ответ 5

Итак, у меня возникла проблема с аналогичным сообщением об ошибке. Я пишу структуру для обработки Scalaров для своей библиотеки и нуждаюсь в квадратном корне. Ошибка была

Невозможно вызвать значение нефункционного типа "Vsip.Scalar"

при вызове sqrt. Исправлено это путем явного вызова sqrt, как показано ниже. Надеюсь, это поможет.

public var sqrt: Scalar {
        switch self.type {
        case .f:
            return Scalar(sqrtf(self.realf))
        case .d:
            let x = Foundation.sqrt(self.reald)
            return Scalar(x)
        case .cf:
            return Scalar(vsip_csqrt_f(self.vsip_cf))
        case .cd:
            return Scalar(vsip_csqrt_d(self.vsip_cd))
        default:
            precondition(false, "sqrt not supported for type \(self.type)")
        }
    }

Ответ 6

В беспорядке с Swift различные типы синтаксиса закрытия + автозаполнение Я часто оказываюсь в беспорядке переменных, возвращаемых типов и используя слишком мало или слишком много наборов () или {}

У меня получилось что-то вроде:

filenames.first(where: { $0 == filename } ) {

}

Что давало ошибку

Невозможно вызвать значение нефункционного типа

Решение заключалось в удалении конечного { }, что неверно в этой форме.

Должно быть только filenames.first(where: { $0 == filename } )

Убедитесь, что вы неправильно применили набор фигурных скобок к концу своей нефункции и т.д., или какую-либо другую трудноопределяемую ошибку в вашем выбранном синтаксисе Swift закрытия.