ユーザーがディープリンク経由でアプリを起動したときに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
}
このエラーは、メソッド(あなたの場合はstructコンストラクター)の代わりにString
を呼び出そうとしていることを示しています。おそらくString
(大文字)という名前のILT
変数をどこか他の場所で宣言したので、失敗します。
投稿されたコード 正常に動作します ですので、エラーはコードのどこかにある必要があります。
作品:
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
を返すことはできません。そうしないと、この(非常に役に立たない)エラーが発生します。
このコードに同様の問題があった
array.first { $0 == item }
問題は、$0
がEquatable
プロトコルに準拠していないことでした。私の場合、NSObjectProtocol
に準拠しており、単純なポインター比較で十分だったため、次の問題を修正しました。
array.first { $0 === item }
次の場合、letステートメントをラップします。
if let xxx = yyy {
... do something
}
Swiftのさまざまなクロージャー構文タイプ+オートコンプリートをいじくり回すと、変数、戻り値のタイプの混乱に陥り、_()
_または_{}
_のセットが少なすぎるか多すぎることがよくあります
私は次のようなものになりました:
_filenames.first(where: { $0 == filename } ) {
}
_
エラーが発生していました
非関数型の値を呼び出すことはできません
解決策は、末尾の_{ }
_を削除することでしたが、この形式では正しくありません。
ただfilenames.first(where: { $0 == filename } )
でなければなりません
非関数などの最後に中括弧のセットを誤って適用していないこと、または現在選択しているSwiftクロージャー構文のその他の見つけにくいエラーを確認してください。
そのため、同様のエラーメッセージで問題が発生しました。私は自分のライブラリのスカラーを処理するための構造を書いていますが、平方根が必要でした。エラーは
非関数型 '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)")
}
}