web-dev-qa-db-ja.com

非関数型 'String'の値を呼び出すことはできません

ユーザーがディープリンク経由でアプリを起動したときにAppDelegate.SwiftによってトリガーされるILTItemControllerをILTViewControllerに渡そうとしています。

私がエラーを持っているコード:

非関数型 '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 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
}
21
James

このエラーは、メソッド(あなたの場合はstructコンストラクター)の代わりにStringを呼び出そうとしていることを示しています。おそらくString(大文字)という名前のILT変数をどこか他の場所で宣言したので、失敗します。

投稿されたコード 正常に動作します ですので、エラーはコードのどこかにある必要があります。

21
redent84

作品:

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

失敗:

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

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

パラメータを使用$0 または _ in)クロージャー式で。

つかいます _ in または $0パラメータを破棄または参照します。クロージャー本体に直接移動してtrueを返すことはできません。そうしないと、この(非常に役に立たない)エラーが発生します。

3
pkamb

このコードに同様の問題があった

array.first { $0 == item }

問題は、$0Equatableプロトコルに準拠していないことでした。私の場合、NSObjectProtocolに準拠しており、単純なポインター比較で十分だったため、次の問題を修正しました。

array.first { $0 === item }
2
Tim

次の場合、letステートメントをラップします。

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

Swiftのさまざまなクロージャー構文タイプ+オートコンプリートをいじくり回すと、変数、戻り値のタイプの混乱に陥り、_()_または_{}_のセットが少なすぎるか多すぎることがよくあります

私は次のようなものになりました:

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

}
_

エラーが発生していました

非関数型の値を呼び出すことはできません

解決策は、末尾の_{ }_を削除することでしたが、この形式では正しくありません。

ただfilenames.first(where: { $0 == filename } )でなければなりません

非関数などの最後に中括弧のセットを誤って適用していないこと、または現在選択しているSwiftクロージャー構文のその他の見つけにくいエラーを確認してください。

1
pkamb

そのため、同様のエラーメッセージで問題が発生しました。私は自分のライブラリのスカラーを処理するための構造を書いていますが、平方根が必要でした。エラーは

非関数型 '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)")
        }
    }
1
JVSIP