2016-01-27 1 views
13

Я пытаюсь передать переменную ILTItem в свой ILTViewController, вызванный AppDelegate.swift, когда пользователь запускает мое приложение через deeplink.Невозможно вызвать значение non-function type '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! 

ИЛТ 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 
} 
+0

сообщения вашего 'декларации класса ILT' – redent84

+0

@ redent84 я добавил его – James

+3

Ваш код работает отлично: HTTP: // swiftstub.com/580271845. Вероятно, вы указали переменную 'String' с именем' ILT' где-то в другом месте, и поэтому она терпит неудачу. – redent84

ответ

14

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

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

+0

Спасибо. Связанная, но немного отдельная проблема с вопросом: мой класс ILTViewController: UIViewController не получает новую переменную - 'print'ing' ILTItem.title' возвращает null. Любая идея почему? – James

+2

Я рекомендую вам открыть новый вопрос с соответствующим кодом и желательно самодостаточный образец проекта, воспроизводящий проблему. – redent84

0

Оберните LET заявление, если, например:

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

Так у меня была проблема с подобным сообщением об ошибке. Я пишу структуру для обработки Скаларов для своей библиотеки и нуждаюсь в квадратном корне. Ошибка была

Невозможно вызвать значение не-функции типа '' 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)") 
     } 
    } 
0

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

Я в конечном итоге что-то вроде:

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

} 

Который давал ошибку

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

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

Если просто filenames.first(where: { $0 == filename })

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

1
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 или вы получите эту (крайне бесполезную) ошибку.

1

Если бы подобный вопрос в этом коде

array.first { $0 == item } 

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

array.first { $0 === item }