2017-03-12 9 views
-1

コンパイラのエラーが表示されています。その理由は分かりません。私はこれには簡単な答えがあると確信しています。保存する前に割り当てようとしているコアデータ属性があります。私のコア内のデータプロパティは、それがこのように定義のファイル:私はそれを選択し、inputViewにそれを置くためにUIPickerを使用していますSwift 3キャストUITexFieldをIntに変換

@NSManaged public var age: Int32 

。それはうまくいくので、ageTextField: UITextField!は値を保持します。私は

person.age = ageTextField.text -> Cannot assign String? to Int32. 

[OK]を次のようちょうど私が取得、保存する前にCoreDataオブジェクトにこれを割り当てようとして、私がいることを理解し、私は

person.age = Int(ageTextField.text) -> Value of Optional String not unwrapped... 

[OK]を、それを投げ、私はそれを取得するので、私はアンラップそれは、それが再びアンラップするように求められますし、私は同意する:

person.age = Int(ageTextField.text!)! -> Type of expression is ambiguous without more context 

私はここで間違っているかわからないんだけど、ちょうど私の古いスウィフト2のコードの上に見て、これは働いていました。これはSwift 3の私の最初のコードです。

+0

Xcode 8では、 '@NSManaged public var age:Int32'のようなものを取り除く必要があります。コアデータエンティティは自動的にクラスになり、その属性は自動的にプロパティになります。 – matt

+1

実際の問題は、単にIntがInt32でないことです。 – matt

+0

こんにちは@matt、ありがとうございます。私はNSManagedObjectサブクラスの作成を使用しました。それが私のソロで迅速に学ぶことができる唯一の方法です。何が良い方法だろう。 – Jonnny

答えて

1

即時問題は間違ったタイプの使用です。 IntではなくInt32を使用してください。しかし、一度それが修正されても、あなたは他の多くの問題があります。

テキストを安全にアンラップしてから、文字列を整数に変換してください。

if let text = ageTextField.text, let num = Int32(text) { 
    person.age = num 
} 

テキストがnilあるか、それが有効な数値ではない値が含まれている場合、それらの!のすべての使用は、クラッシュの原因となります。必ず安全なアンラッピングを使用してください。

2

このコンパイラのエラーは、よく見えにくく、最悪の場合誤解を招きます。 Int32にあなたのキャストを変更します。また

person.age = Int32(ageTextField.text!)! 

:あなたは、ユーザーが常にテキストフィールドに有効な番号を入力することが絶対的に確信している場合を除き、代わりに力アンラップの結合のオプションを使用します。

if let text = ageTextField.text, 
    let age = Int32(text) 
{ 
    person.age = age 
} 
+0

FYI - あなたの編集については、オプションの結合を使用しています。 – rmaddy

+0

@rmaddyありがとう。 –

0

変換前にオプションのものを必ず開封してください。コードを安全にします。

+0

'Int32(string)'がオプションを返すので、これはコンパイルされません。さらに、他の2つの回答の複製を投稿する必要はありません。 – rmaddy

+0

はい、そうです。重複した回答を申し訳ありません。 –

+0

回答は重複しているだけでなく、間違っているので、自由に削除してください。 – rmaddy

関連する問題