Swiftのコンパイルエラー寄せ集め
Appleが2014年6月に出してきた新しいプログラミング言語Swiftのコンパイルエラーの収集。こんなプログラムでこんなエラーが出ました、という例をいくつか集めたものです(仕様を読みながらわざとエラーを出したものもかなり含む)。理想を言うならコンパイルの工程を理解した上でそれぞれの説明をしたいのだが、かなり専門的になるのでそこまでは出来ない。
var abc: Int や var abc = 0 なら型が決まる(推測できる)のでOK。
var a, b, c: IntならOK。
値を初期値以外にするならvarで宣言すること。
新しいクラスや構造体を定義しようとしたが、そのクラス名はすでにある場合
【確認ver】Swift 3.0.2【語】element (配列の)要素
SuperのSはエラーメッセージ内では大文字ですが、プログラムに書くときは小文字になります。
Swiftの初期化は基本的に
・自分のプロパティ初期値
・superの初期化メソッドを呼ぶ
・superのプロパティの初期値の上書き
の順番です
ちなみにSwift3.0.2の時点での仕様ですが、呼び出しを忘れていると初期化メソッドの最後に親初期化メソッドを勝手に呼んでくれる機能があります。条件はsuperがinit()という引数なしの初期化メソッドを持ち、それがdesignatedイニシャライザーで、designatedイニシャライザーがそれひとつしかない場合です。以下の場合はエラーが出ません。
自分のクラスで宣言したものの初期化とsuper.init呼び出しには順番があり、
1 自分のクラスで宣言したものの初期化
2 super.init系呼び出し
3 上のクラスから継承したものの初期化
の順番で呼び出すこと。
ただし、convinienceイニシャライザの場合はこれは当てはまらない。
Use of selfというのは「selfを使え」という命令形の意味ではなく、「self(のプロパティなど)を使っていることが問題です」という意味。
ただしselfを使ってなくてもこのメッセージが出ることがある。その場合selfをつけてもメッセージは変わらない。
Use of selfというのは「selfを使え」という命令形の意味ではなく、「selfを使っていることが問題です」という意味。ただし、self.aを単にaと書いた時でもこのメッセージが出るのでわかりずらい。
Consecutive〜が2つあるが、メソッド内での宣言に対してstatementsのほうが出て、クラスメンバの宣言に対してdeclarationsのほうが出る。Expected declarationはどちらでも出る。
この場合もおすすめされた修正候補を選んでも治りません。
初期化出来無いものでインスタンスを作ろうとした。
入れ子というか、一行に複数の宣言があるときに出る。
また、static変(定)数だと大丈夫。
初期化メソッドの実行や、初期値の代入が必要です
Variableと表示されるかConstantと表示されるかはvarかletによる。
used before being initializedのエラーメッセージとだいたい同じノリ
面白いのはUIColorの宣言の違いによりエラー扱いとするかどうかが変わること
あるものがアクセス可能な範囲内の2箇所で定義されていて、どちらを呼び出せば良いかわからないときなどに出る。
タイプ変数をインスタンスメソッド内で型名を付けずに使うと出る。
class宣言した変数にもこのメッセージが出る。
readはリード?レッド?neverの後にあるのでリード?レッドならbe readか?
宣言時にvar abcArray: [String] = []とすることで初期化出来る。ここで言う初期化はインスタンス化の意味で使われている。
配列には「宣言しただけで初期化していない状態」と、「初期化した状態」があるので、初期化済みか意識することが必要。
対応は、var変数にするか、一行で初期化を行うかにする。
漠然としたメッセージなのである程度エラー原因を推測することが必要か。
***には[Any]が入ることが多い。
でもエラー。
(myFontAttributes[NSParagraphStyleAttributeName] as? NSMutableParagraphStyle)?.alignment = .left
にするとエラーは出ないが、もう少しシンプルな方法がありそうな気もする。
lunch.append("cheeseburger")を使うと可能。
関数、メソッドの実行文で引数が多すぎるときに出る。
【確認ver】Swift 3.0.2
関数の定義などで引数にラベルが付いている(要求している)が、呼び出す側では書かれていない。コンスストラクタ呼び出しでも同様の状況で出ます。
戻り値の型が違う。
関数/メソッド内で保持する値をどう宣言すればいいかは要調査。→どうやらC言語の関数内staticにあたるものはない模様。
結果を使わない場合は
_ = abc()
とするとワーニングが消える。
また、型名の後ろに!か?をつければこのエラーは消えます。このやり方は初期化やオプション型を理解していないと危険。
メソッドをオーバーライドしようとしたときに、スーパークラスにそのメソッドがないか、引数や戻り値の組み合わせが違うか、必要なスーパークラスの継承が出来ていない。
プロパティをオーバーライド(つまり演算プロパティのget setで上書きしようとしている)しようとしたときに、スーパークラスにそのプロパティがないか、必要なスーパークラスの継承が出来ていない。
実行したクラスはルートクラス(親クラスをもたない)になっている。
***の対象となるのはoverride
書かれているところがクラスの定義の外側
***に当てはまるのはsuper
引数のリストは()の中に書く。引数がなくても()は書く事。
演算プロパティの場合はclassでよいが、ストアドプロパティの場合はstaticを用いるべき(classとstaticの違いが発生しないので使用するのはstaticのみ)。
classComputedPropertyはgetter/setterがないのでストアドプロパティの可能性があると判断されてエラー
funcの前にmutatingをつければOK
対応は、宣言時に=0するか、init()の中でabc = 0などをする。
requiredを付けたイニシャライザはサブクラスを作った際に実装(オーバーライド)しないといけない。そして、次のサブクラスでも実装させるためにそれもまたrequiredをつけないとだめ。
同じ型の中で指定イニシャライザーから指定イニシャライザーを呼ぶことは出来ない。
コンビニエンスイニシャライザーから指定イニシャライザーを呼ぶことは出来るので、コンビニエンスイニシャライザーにしてはどうかとおすすめされる。
とりあえずインスタンスを作るだけなら、designatedイニシャライザーがおすすめ。super.init(frame: CGRect())など。
サブクラスでinitメソッドをひとつも書かない場合は免除される模様
convenience初期化メソッドからはdesignated初期化メソッドを呼ばないといけない
superのconvenienceをオーバーライドした時に出る。
初期化メソッドはdesignatedとconvenienceがある。オーバーライドされることが出来るのはdesignatedのみ。このときoverrideを付ける。つまりinitにoverrideをつけた場合はそのinitはdesignatedである必要がある。しかし、それがconvenienceの場合は矛盾するのでこのメッセージが出る。
初期化が不完全な時に出る。
requiredがあれば十分。
Swift2.0あたりの仕様変更でDoubleのときでもIntの時と同じようにデフォルト値が与えられるようになったのでメッセージは修正の必要があります。
Aomは指定値1で、1.0が設定される。
Iwaは指定値5で、5.0が設定される。
Akiは指定値6で、6.0が設定される。
Miyは指定値10.0で、10.0が設定される。
Yamは前の指定値が整数ではないのでエラー。
これはenum宣言中のcaseにコロンを付けてしまったときに出てきます。
このメッセージですが、ラベルというのはコロンを付けた状態のことを言っています。
具体的にどんなのがあるかわからなかったのでCharacterでサンプルコードを作りました。
親クラスで宣言してあるプロパティ(ストアド、演算型の両方を含む)をストアドプロパティで再宣言(またはoverride)しようとした。
finalをつけたクラスは下へ継承出来ない。
finalで宣言してあるプロパティ(ストアド、演算型の両方を含む)をサブクラスの演算プロパティでオーバーライドしようとした。finalされていなく、letでないものならそれを演算プロパティでオーバーライドすることは可能。
let宣言されたプロパティを、演算プロパティでオーバーライドしようとしたとき。
演算プロパティはvar扱いになるので、規制を緩める方向への変更になる。これを禁止しているのかと思われる。
サブクラス側をletで宣言すると演算プロパティに出来ない(演算プロパティはvarのみ)。演算プロパティに出来ないならオーバーライド出来ない。つまりlet宣言されたプロパティはオーバーライド出来ないということだろうか。
finalで宣言してあるメソッドをサブクラスでオーバーライドしようとした。
クラス内で宣言するものにはclassとstaticが使える。structとenumはstaticのみが使える。
classを付けたものは下のクラスで継承出来る。structとenumは継承の機能がないのでclassは使い道がない。
プロトコル内ではstaticのみ。プロトコルはstructやenumに付けられる可能性があるため。プロトコル内で宣言したstaticメソッドを、適用クラス内でclassで定義してもOK。
プロトコルではstaticとなっていても、これを適用したクラスで、class func funcA(a: Int) {}と出来る。
プロトコルが何か理解していないときは理解が必要です。これは少し時間がかかります。
逆にプロトコルではgetのみのものを、実装側で読み書き出来るようにするのはOK。
プロトコルの定義内には名前と引数と戻り値のみを書く。
getやsetの中身はいらない。
var a: Int { get set }
でOK。
{ get }や{ get set }が正しい
Swiftのエラーメッセージではtop lebelと表現されることもある
global scopeで宣言されている変数/定数はglobal変数/global定数
global scopeで宣言されているfunctionはglobal function
関数やメソッド内などでしか実行できない命令を関数やメソッドの外で行った時
Bにはややこしいものが入ることがある
++や--は廃止になったので従来のC言語の使い方をすると出る。
中身の型が同じ組み合わせは昔はエラーが出たがSwift3.0では出ない。
2つを比較する==と===は、クラス同士か構造体同士かで挙動が逆になるので注意。
構造体のオプショナル同士でも===でエラー。==にすればエラーにならない。
クラスのオプショナル同士の場合も==でエラーになり、===でエラーにならない。
おまけ
&や|や*が変なところに入っている
.の後ろが書かれていない
宣言を忘れているとき。
宣言と実装で〜fixの不一致。preとpostなど。
他にremainder(dividingBy:)というのもある。
指数部の数字は10進で表記する。つまりp9はOKでpaはNG。今回のp-4はOK。
指数部の数字による小数点移動は2進状態に対して行われる。つまり上の例は、1.1010(2進)上で4つ移動して、0.0001101(2進)となる。これを16進にすると0.1a(16進)。これを10進に直すと、1/16 + 10/256 = 0.1015625。個人的には、この小数点移動操作が2進なのは盲点だった。16進表記のままで4桁の小数点移動操作を行うと0.0001a(16進)となり、だいぶ小さい値になってしまう。
下のリストを参照
少数表現16進ではe4などで終わると指数の意味で使っているかどうか解釈に迷うことになるので、指数表現に用いる文字はpを使います。少数表現16進は指数表現をつけることが必須です。
10進表現にpを使った場合はpから別の文と解釈される
小数点直後の指数表現はだめ
ちょっと原因がわかりにくいエラー
nestedの意味がよくわからない。
【確認ver】Swift 4.0
let (ラベル名: 変数名 , ラベル名: 変数名)と解釈される
var (ラベル名: 変数名 , ラベル名: 変数名): (ラベル名: 型, ラベル名: 型)
なのでラベル名が重複している
ちなみにisにしてもエラーになる
値があるかnilかの判定は!= nilを使う
if let c = a, d = b where c && d {}
等がよいか。
true/falseのどっちが表示されるかは==か!=かによる
returnやthrowが必要。ちなみにbreakを使うとエラー。
カウンターは(我々が操作出来ないという意味で)定数という扱いらしい
forの条件が i in 0..<10の形式のときは()をつけてはいけない
letを省いたらコンパイルエラーはなくなる
複数の"場合"で同じ処理をするには"場合"を,(カンマ)で区切って記述する。
fallthroughの後にはcaseブロックかdefaultブロックをつけること
【確認ver】Swift 4.0.2
場合分けにもれがあるときに出る
Swiftの仕様にdo-try-catchが追加されたときにdo-whileのdoは使用禁止になりました。
cannot be declared publicとmust be declared privateは同じようなものだが文面に違いがあるのは、"publicをつけてはいけない"と言いたいのか、"privateをつけないといけない"と言いたいのかの違い。
アクセス修飾子がなにも付いていないものはinternal(モジュール内のみからアクセス許可)
これも文面に違いがあるのは、"publicをつけてはいけない"と言いたいのか、"privateをつけないといけない"と言いたいのかの違い。
private(set) var a: Int {ならエラーが出ない。
private(set) var a: Int {ならエラーが出ない。
よってこれらのエラーはpublic(get)に対して、それはsetの間違いなのではないかと指摘するエラーメッセージと思われる。getにもsetにもprivateを設定しているものは、それでもprivateのsetを要求するメッセージが出る。これも上の理由によりprivate(get)が書かれたことが原因で出てきたものと推測。
関数の戻り値に?付きでないものが宣言されているのにnilを返そうとした
オプショナル型やアンラップの意味がわからない場合は、オプショナル型について調べる(少し時間がかかります)
オプショナル型をアンラップしないままで何かしたときなど
保持の意味がわからないときの推薦検索用語はstrong weak ARC 参照カウンタ
オプショナルはだめ
Swift2.0で発生した少し謎に思えるコンパイルエラー。
ちなみにSwift 2.0の段階ではstr.characters.countがおすすめ。
ただしObjective-Cとカウント結果を揃えたいならstr.utf16.countがよいかも。
ただしObjective-Cとカウント結果を揃えたいならstr.utf16.countがよいかも。
上のサンプルを参照。
do catchで囲むなり、上(呼び出し元)に投げるなりする。
上のサンプルを参照。
do catchで囲むなり、上(呼び出し元)に投げるなりする。
try?を使ったときに出る。上の例ではbへの代入のところで出ている。try?の文はエラーが発生しても次の文へ移る。エラーが出たときはbにはnilが入って、エラーの発生の有無を確認できるようにする。someThrowingFunction()はIntを返すメソッドだが、nilを許容するためにbはInt?としなければいけない。型指定がなければ自動でInt?となる。
またメッセージの最後のchain with '?'が謎であるが、次の様にメソッドがオプショナルを返すと定義されているときにtry?の戻り値の型がInt??となるが、それのことかなという気がする。
また、このメソッドの危険度を5としたが、fix-itで出てきたtry!を選ぶとエラー発生のときに実行時エラーとなるので危険。
let b = abc(a: 0)でOK。
これらはループもswitchでもないところで書かれたときに出る。
飛び先のラベル指定に問題があるときに出る。
println(古い方)を使って複雑な引数を与えると出る。printlnを使っていることがだめなのでprintを使えという内容を出して欲しい。バージョンアップで修正される可能性が高い。
print(新しい方)への引数の与え方としてはOKなものでも出る。
上のと同じように、println(古い方)を使って複雑な引数を与えると出る。printlnを使っていることがだめなのでprintを使えという内容を出して欲しい。バージョンアップで修正される可能性が高い。
print(新しい方)への引数の与え方としてはOKなものでも出る。
Fix-itが出てきますが、それを適用しても変になります。
"be+受け身"のbe動詞がない?
Swift 2.1のときは名前が変わって間もないのでこの親切なエラーメッセージだったが、Swift3.1ではUse of unresolved identifier 'println'という冷たいメッセージになった。
何かを宣言をするつもりで途中でやめたとき
宣言を書かないといけないところで何か変なものを書いたときに出る
かなりいろいろな状況で出る。コンパイラが分析しているときに予期していないものが出てきた場合に多い。
予想だが、このエラーは何か「書かれる必要があるもの」が書かれていないときに出るのではないか、と思われる。また、その「書かれる必要があるもの」はエラー箇所より前の部分にヒントがあることもある、と思われる。
(例1)何かを書くつもりで途中でやめた
(例2)別の言語の文法で書いた。例えばObjective-Cなど
3項演算子にしたいなら?の前にスペースを入れるとできる。var b = a ? 1:0
これは専門のエラーメッセージが作れそう。
l-valueというのはコンパイラの内部で使われる専門用語か?
コメント開始記号/*に比べて閉じ記号*/が多いとき
どこかで{が抜けているか、単純に}が多い。
{}などで囲まれた部分が何かの原因で無効になった?
{}より前で何か問題がある場合にも出る
コンパイラが混乱したときに出るようだが、かなりいろいろな状況で出る。同時に出ているものが他にあるときは他のものの方にヒントがあることが多い。
a * bのように演算子の前後の空白を揃えると出なくなる。
提案項目があるときに出る。精度はまあまあ。
{}での前の部分に何か問題があることが多い
varかlet忘れ
static var a:Int = 0ならOK
static let a:Int = 0ならOK
class varとしたいなら演算プロパティにするとOK
class letはNG。classにするなら演算プロパティにしないといけないし、演算プロパティはletに出来ないので。
SwiftのバージョンアップでA***がB***に変更された時
他のメッセージに変更になった。
非オプショナル型はだめらしい
C言語の文字表現はだめ。
Xcodeのバージョンを上げてワーニングの出し方か変わった場合、古いプロジェクトを立ち上げると出ることがある。この文章の下に箇条書きで有効にする警告が具体的に書かれる。
Localizable.stringsの;忘れ
宣言、初期化の実行文
Type annotation missing in pattern
型の指定がない(型がわからない)
【確認ver】Swift 3.0.2【語】annotation 注釈//Swift 3.0.2
var abc //エラー
abcが何の型かわからない。var abc: Int や var abc = 0 なら型が決まる(推測できる)のでOK。
//Swift 3.0.2
var a, b, c: Int = 0 //エラー
Intと=0はcのみに対して適用されるようで、aとbが不確定になる。var a, b, c: IntならOK。
//Swift 3.0.2
var a, b = 0, c: Int //エラー
aに対して、= 0は適用されない(bに対して適用)、Intもaに対して適用されない(間に= 0が適用されたbがあるため?)Cannot assign to value: '***' is a 'let' constant
値を代入できません。***はletで定義された定数です。
【確認ver】Swift 3.0.2【語】assign 割り当てる値を初期値以外にするならvarで宣言すること。
//Swift 3.0.2
let abc = 0
abc = 1 //エラー
//Swift 3.0.2
func funcA(a: Int) {
a = 0 //エラー
}
関数の引数で与えられたものを関数内で変更しようとした。関数の引数はデフォルトで定数扱い。関数内で変数として使いたいなら関数の頭でvar a = aなどとして書き換え可能にする。Cannot assign to value: '***' returns immutable value
値を代入できません。***は変更できない値です。
【確認ver】Swift 3.1【語】assign 割り当てる//Swift 3.1
let a = 1
if 0...10 = a { //エラー
print("a")
}
if caseを使うか、パターンマッチの~=を使う状況で中途半端になった。Cannot assign through subscript: '***' is a 'let' constant
subscriptを通して代入できません。***はletで定義された定数です。
【確認ver】Swift 3.0.2//Swift 3.0.2
let i = [0,1]
i[0] = 0 //エラー
配列はletで宣言されているので各要素も変更不可。Variable used within its own initial value
初期値を与えるときにその値を使おうとしている(代入しようとしている)
【確認ver】Swift 3.0.2【語】within の中で//Swift 3.0.2
var abc = abc //エラー
//Swift 3.0.2
class SomeSpecial {
}
let someSpecial = someSpecial() //エラー
インスタンス名が、クラス名の頭文字を小文字にしただけというよくあるパターンで、クラス名の頭文字が小文字になっている。Use of undeclared type '***'
'***'という型はありません
【確認ver】Swift 3.0.2【語】undeclared 宣言されていない//Swift 3.0.2
var abc: Int256 = 100 //エラー
//Swift 3.0.2
//import UIKit コメントアウトしてみる
class ViewController: UIViewController { //エラー
}
UIKitの非importによりUIViewControllerが何かわからない。//Swift 3.0.2
println("あいうえお") //エラー
printlnは廃止になった。printを使う。Invalid redeclaration of '***'
無効な再宣言の***
【確認ver】Swift 3.0.2【語】Invalid 無効な redeclaration 再宣言新しいクラスや構造体を定義しようとしたが、そのクラス名はすでにある場合
//Swift 3.0.2
var abc = 0
var abc = 1 //エラー
//Swift 3.0.2
class A {
}
class A { //エラー
}
//Swift 3.0.2
class ClassExtensionTest {
func funcExtensionTest() {
}
}
extension ClassExtensionTest {
func funcExtensionTest() { //エラー
}
}
extensionでは既存のものを再定義出来ない。//Swift 3.0.2
var a = 0
func a() -> Int { //エラー
return 0
}
変数と引数なしの関数の組み合わせも同一名監視対象Array types are now written with the brackets around the element type
今は配列の型をカッコの中に書きます
昔はカッコの前に書くのが許されたが今はカッコの中に書くようになっている。【確認ver】Swift 3.0.2【語】element (配列の)要素
//Swift 3.0.2
var abc: Int[] //エラー
Int[]ではなく[Int]とすること。DidSet (WillSet) variable may not also have a set specifier
DidSet (WillSet)(を含む)変数はsetをもってはいけない
【確認ver】Swift 3.0.2【語】specify 細かく指定する//Swift 3.0.2
class classA {
var a: Int {
set {
a = newValue
}
get { //エラー なぜかgetのところで出たりする
a
}
didSet {
//何か
}
willSet {
//何か
}
}
}
DidSet (WillSet)とsetを併用しているComputed property must have accessors specified
演算プロパティ(訳?)はアクセサー(set get)を持たないといけない
【確認ver】Swift 3.0.2//Swift 3.0.2
var abc: String {
} //エラー
Computed property must have an explicit type
演算プロパティ(訳?)は明確に型を持たないといけない
【確認ver】Swift 3.0.2//Swift 3.0.2
class A {
var a { //エラー
set {
self.a = newValue
}
get {
return self.a
}
}
}
a: Intのように型を明記すること'let' declarations cannot be computed property
定数は演算プロパティ(訳?)になれない
【確認ver】Swift 3.0.2【語】compute 計算する//Swift 3.0.2
let a: Int { //エラー
get {
return 100
}
}
//Swift 3.0.2
protocol protocolA {
let a: Int { get } //エラー
}
プロトコルで定数を宣言するときはvar a: Int { get }とするとOK。プロトコルを準拠した型のほうでletに出来る。Variable with a setter must also have a getter
セッターを持つ変数はゲッターも必要
【確認ver】Swift3.0.2//Swift 3.0.2
class SomeClass {
var a: Int {
set { //エラー
self.a = newValue
}
}
}
Immutable value '***' may only be initialized once
変更不可の'***'は一度しか初期化出来ない
【確認ver】Swift3.0.2【語】Immutable 不変の//Swift 3.0.2
class ABC {
let abc: Int
init() {
abc = 0
abc = 0 //エラー
}
}
initメソッドの中で2回let定数に値を設定しようとした//Swift 3.0.2
struct StructABC {
let a: Int = 0
init() {
a = 1 //エラー
}
}
初期値が与えられているものにinitの中で値を入れようとした。Immutable value '***' may not be assigned to
変更不可の'***'に代入出来ない
【確認ver】Swift 3.0.2//Swift 3.0.2
class ABC {
let abcArray: [Int]
init() {
abcArray = [Int](repeating: 0, count: 5)
abcArray[0] = 1 //エラー
}
}
initメソッドの中で配列を一気に初期化した後で個別に値を設定しようとしたCannot invoke initializer for type 'A***' with an argument list of type '(B***)'
与えられた引数(B***)の型では、A***のイニシャライザーを実行できません。
【確認ver】Swift 3.0.2【語】invoke を起動させる//Swift 3.0.2
struct StructABC {
var a: Int = 0
var b: Int = 0
let c: Int = 0
}
func testStruct() {
let a = StructABC(a: 0, b: 0, c: 0)//エラー
}
cはletで宣言されて初期値が設定されているので、イニシャライザの引数で渡すことが出来ない。Super.init isn't called on all paths before returning from initializer
初期化メソッドから戻る(メソッドが終了する)時点より前に、どんな経路でもsuper.initが呼ばれていません
【確認ver】Swift 3.0.2SuperのSはエラーメッセージ内では大文字ですが、プログラムに書くときは小文字になります。
Swiftの初期化は基本的に
・自分のプロパティ初期値
・superの初期化メソッドを呼ぶ
・superのプロパティの初期値の上書き
の順番です
//Swift 3.0.2
class A {
var a: Int
init(aa: Int) {
a = aa
}
convenience init() {
self.init(aa: 0)
}
}
class B: A {
var b: Int
init(bb: Int) {
b = bb
} //エラー
}
ちなみにSwift3.0.2の時点での仕様ですが、呼び出しを忘れていると初期化メソッドの最後に親初期化メソッドを勝手に呼んでくれる機能があります。条件はsuperがinit()という引数なしの初期化メソッドを持ち、それがdesignatedイニシャライザーで、designatedイニシャライザーがそれひとつしかない場合です。以下の場合はエラーが出ません。
//Swift 3.0.2
class C {
var c: Int
init() {
c = 0
}
}
class D: C {
var d: Int
init(dd: Int) {
d = dd
} //エラーにならない
}
Property 'self.***' not initialized at super.init call
***プロパティはsuper.initを実行する時点で初期化されていません
【確認ver】Swift 3.0.2自分のクラスで宣言したものの初期化とsuper.init呼び出しには順番があり、
1 自分のクラスで宣言したものの初期化
2 super.init系呼び出し
3 上のクラスから継承したものの初期化
の順番で呼び出すこと。
ただし、convinienceイニシャライザの場合はこれは当てはまらない。
//Swift 3.0.2
class Oya {
var a: Int
init() {
a = 0
}
}
class Ko: Oya {
var b: Int
override init(){
super.init() //エラー
a = 1
b = 0
}
}
//Swift 3.0.2 正しい例
class Oya {
var a: Int
init() {
a = 0
}
}
class Ko: Oya {
var b: Int
override init(){
b = 0
super.init() //bが初期化されているのでエラーが出ない
a = 1
}
}
Use of 'self' in property access '***' before super.init initializers self
super.initを呼ぶ前に'***'にアクセスするのにselfを使っている
【確認ver】Swift 3.1Use of selfというのは「selfを使え」という命令形の意味ではなく、「self(のプロパティなど)を使っていることが問題です」という意味。
ただしselfを使ってなくてもこのメッセージが出ることがある。その場合selfをつけてもメッセージは変わらない。
//3.1
class Oya {
var a: Int
init() {
a = 0
}
}
class Ko: Oya {
var b: Int
override init(){
a = 1 //エラー
b = 0
super.init()
}
}
この例では親のinitを呼ぶ前に親のプロパティに値を入れていることがいけないことだが、エラーメッセージにはそれが書いていないのでちょっと困る。Use of 'self' in property access '***' before self.init initializers self
self.initを呼び出す前にプロパティ***へのアクセスでselfを使っている
【確認ver】Swift 3.0.2Use of selfというのは「selfを使え」という命令形の意味ではなく、「selfを使っていることが問題です」という意味。ただし、self.aを単にaと書いた時でもこのメッセージが出るのでわかりずらい。
//Swift 3.0.2
class A {
var a: Int
init(aa: Int) {
a = aa
}
convenience init() {
a = 0 //エラー
self.init(aa: 0)
}
}
Consecutive statements on a line must be separated by ';'
一行に連続して文を書く時は;で区切って下さい
Consecutive declarations on a line must be separated by ';'
一行に連続して宣言を書く時は;で区切って下さい
Expected declaration
想定された宣言方法(になっていない)
【確認ver】Swift 3.1【語】Consecutive 連続したConsecutive〜が2つあるが、メソッド内での宣言に対してstatementsのほうが出て、クラスメンバの宣言に対してdeclarationsのほうが出る。Expected declarationはどちらでも出る。
//3.1
var abc def: Int //エラー
このように一行で複数の変数を宣言しようとして区切りが無いときにも出るが、この場合の正しい区切りは,(カンマ)です。Fix-itで提案された;(セミコロン)の修正候補を選んでも治りません。//3.1
var abc = 0: Int //エラー
= 0は一番最後にすること。この場合もおすすめされた修正候補を選んでも治りません。
//3.1
b: Int = 0 //エラー
letやvarを単純に忘れている'***' cannot be constructed because it has no accessible initializers
***にはアクセスできる初期化メソッドがないので***は作られません。
【確認ver】Swift 3.1初期化出来無いものでインスタンスを作ろうとした。
//3.1
protocol ABCProtocol {
func abc()
}
class ABCClass {
var myP = ABCProtocol() //エラー
}
プロトコル名でインスタンスを作ろうとした。//3.1
enum EnumTest {
}
func enumFunc() {
var a = EnumTest() //エラー
}
enumでインスタンスを作ろうとした。Cannot call value of non-function type '***'
ファンクションではない***は呼べません
【確認ver】Swift 3.1//3.1
class A {
var a: Int = 0 { //エラー
get {
return self.a
}
set {
self.a = newValue
}
}
}
演算型とストア型のどっちにしたいのか不明なのでどちらかにはっきりすること//Swift 3.0.1
class A: UIView {
func funcA() {
let next = self.nextResponder() //エラー
}
}
nextResponder()はnextResponderになった(さらにnextになった。)。このようなメソッド→プロパティの変更がされたものに出る。//Swift 3.0.2
Bundle.mainBundle() //エラー mainBundle()はmainBundleになった(さらにmainになった。)。
FileManager.defaultManager() //エラー defaultManager()はdefaultになった。
Inheritance from non-protocol, non-class type '***'
***という非プロトコルかつ非クラスから継承できません
【確認ver】Swift 3.2//3.1
class A {
class a: Int { //エラー
set {
self.a = newValue
}
get {
return self.a
}
}
}
class varのvarを忘れているのでIntから継承されたaだと解釈した'***' cannot appear nested inside another 'var' or 'let' pattern
***は他のvarやletのパターンの中に入れ子で現れることは出来ません
【確認ver】Swift 3.0.1入れ子というか、一行に複数の宣言があるときに出る。
//Swift 3.0.1
//aとbはOK
var a = 0
var b = 0
//cとdはOK
var c = 0,
d = 0
var e = 0,
var f = 0 //エラー ひとつ目の最後にカンマが残っている
var g = 0
h = 0 //エラー varがない
var i = 0; var j = 0 //OK
var k = 0, l = 0 //OK
var m = 0, var n = 0 //エラー ,のうしろにvarがある
var o = 0; p = 0 //エラー ;で区切ったのにvarがない
//Swift 3.0.1
var a = 0, b = 0
//これを
var a = 0,
b = 0
//こうして
var a = 0,
var b = 0
//こうしたときにエラーが起こる
一行に複数宣言してあるもの(var a = 0, b = 0 など)を複数行に分けたときCannot use instance member '***' within property initializer; property initializers run before 'self' is available
プロパティイニシャライザでインスタンスのメンバ***は使えません。プロパティイニシャライザはselfが利用可能になる前に実行されます。
【確認ver】Swift 3.0.1//Swift 3.0.1
class A {
let number = 5
let testArray = [Int](repeating: 0, count: number) //エラー numberは使えない
}
init(){}の中で設定するならOK。また、static変(定)数だと大丈夫。
'init' is a member of the type; use 'type(of: ...)' to initialize a new object of the same dynamic type
initはタイプのメンバです。同じダイナミックタイプの新しいオブジェクトを初期化するにはtype(of: ...)を用いて下さい。
【確認ver】Swift 4.0//4.0
class A {
func abc() {
let a = self.init() //エラー
let b = type(of: self) //OK
}
}
initはインスタンスメソッドではない。type(of: ...)を使えばOK。Constructing an object of class type '***' with a metatype value must use a 'required' initializer
メタタイプを使って***クラス型のオブジェクトを作るには、requiredが付いた初期化メソッドが必要です。
【確認ver】Swift 4.0//4.0
class A {
//required init() {} これがあればOK
static func abc() {
let a = self.init() //エラー
}
}
required init() {}があればOKになる。'let' declarations cannot be computed properties
letで宣言されたものは演算型プロパティに出来ません
【確認ver】Swift 4.0//4.0
class A {
var a: Int = 0
let b :Int {
get {
return -a
}
set {
self.a = -newValue
}
}
}
Variable '***' was never mutated, consider changing to 'let' constant
変数***は、(この先)変更されません。let(で宣言する)定数を検討して下さい。
【確認ver】Swift 3.1//3.1
var abc = 0 //ワーニング
print(abc) //使用はされる
//この先変更されない
変数/定数の使用、代入操作
数値にアンダーバーを入れる表記法ですが、4桁ごとにいれてもエラーにはならないですvar abc = 100_0000 //エラーではない
Variable/Constant '***' used before being initialized
***は使う前に初期化されていません
【確認ver】Swift 3.1初期化メソッドの実行や、初期値の代入が必要です
Variableと表示されるかConstantと表示されるかはvarかletによる。
//3.1
var abc: CGPoint
var a = abc.x //エラー Variable 'abc' 〜
abcを初期化しないで使っている//3.1
func testFunc(a a: Int) {
let b: Int
switch a {
case 0:
b = 1
case 1:
b = 10
default:
break
}
if b == 0 { //エラー Constant 'b' 〜
}
}
switchをdefaultで通ったときに初期化されない。//3.1
var abcArray: [String]
var abcArray0 = abcArray[0] //エラー Variable 'abcArray' 〜
配列を初期化前に使っている//3.1
let abc2: Int
let abc3 = abc2 //エラー Constant 'abc2' 〜
let定数の初期化忘れに対しても出る //3.1
class ClassA {
var a: String
init?(b: String?) { //エラー
if b == nil {
return nil
}
}
}
失敗のあるイニシャライザでストアドプロパティ(self.a)の初期化忘れ。これが失敗のないイニシャライザの場合は別のメッセージになる。Struct '***' must be completely initialized before a member is stored to
構造体***は値を入れられる前に初期化されていないといけません
【確認ver】Swift 3.1//3.1
struct StructA {
var aa = 0
}
var a: StructA
a.aa = 1 //エラー
Variable/Constant '***' captured by a closure before being initialized
***は初期化されていないうちにクロージャに捕らえられました(メソッドを実行しようとしました)
【確認ver】Swift 3.1used before being initializedのエラーメッセージとだいたい同じノリ
//3.1
let fillColor: UIColor
fillColor.setFill() //エラー
fillColorが初期化されていない面白いのはUIColorの宣言の違いによりエラー扱いとするかどうかが変わること
//3.1
let fillColor1: UIColor
fillColor1.setFill() //エラー
let fillColor2: UIColor!
fillColor2.setFill() //エラー
var fillColor3: UIColor
fillColor3.setFill() //エラー
var fillColor4: UIColor!
fillColor4.setFill() //エラーなし
Cannot assign a value of type 'A***' to type 'B***'
A***をB***に代入できません
【確認ver】Swift 3.1//3.1
var abc: Int = 1
var abc2: UInt = 1
abc = abc2 //エラー
Int8とUint8間の代入やInt16をInt8に代入、またInt8をInt16に入れるときも出るCannot assign a value of type '()' to type '***'
()(未定なもの?)を***に代入できません
【確認ver】Swift 3.1//3.1
var abc: Int
var abc2: Int
abc = abc2 = 1 //エラー
代入演算で値を返さなくなっているのでC言語の書き方はNG//3.1
var abc: Int
var abc2: Int
abc =
abc2 = 1 //エラー
縦に並べててあるとエラー箇所に気が付きにくいInteger literal 'A***' overflows when stored into 'B***'
入れようとしている整数値A***は'B***'の型には大きすぎる
【確認ver】Swift 4.0//Swift 3.0.2
var abc: UInt8 = 1000 //エラー
//Swift 3.0.2 64bit環境で
var a = 9999999999999999999 //エラー
Intの範囲(この場合64bit)を超えた//4.0
for i in 0..<10000000000000000000{ //エラー
}
だめらしい。Int64の範囲内ならOK。超えるとエラー。//4.0
let n: Int8 = 6
let nn = n | 0xf0 //エラー
ビット演算でも数値としてみたときに範囲overならだめ。Negative integer 'A***' overflows when stored into unsigned type 'B***'
入れようとしている負の数A***は'B***'の型には入りません
【確認ver】Swift 3.0.2//Swift 3.0.2
var abc: UInt8 = -1 //エラー
Expected expression in assignment
代入処理で(正しい)式が期待される
【確認ver】Swift 3.1//3.1
var abc: Int = 0
if abc == 3 {
abc =
} //エラー
イコールの後で何か書こうとした所(この場合は閉じカッコ})で発生するAssigning a variable to itself
自分に代入している
【確認ver】Swift 3.0.2//Swift 3.0.2
var abc = 0
abc = abc
Cannot assign value of type 'A***' to type 'B***'
A***の値をB***型に代入できません
【確認ver】Swift 3.0.2//Swift 3.0.2
let aTuple = (first: 1, second: 2, third:3)
var bTuple = (ichi: 1, ni: 2, san:3)
bTuple = aTuple //エラー
型が同じタプルでも名前が違っていたら代入できない。//Swift 3.0.2
var a = 0
var b = 0
a =
b = 1 //エラー Cannot assign value of type '()' to type 'Int'
aに対しても= 1を書かないといけない。C言語のような複数の値に一度に代入するものはNG。//Swift 3.0.2
var array1 = [1, 2, 3]
array1[0..<1] = 0 //エラー
array1[0..<1] = [0]ならOK。この場合追加するものは配列にしないといけない。'=' must have consistent whitespace on both sides
=の両サイドのスペースは統一されている必要がある。開けるなら開ける。開けないなら開けない。
【確認ver】Swift 3.1//3.1
var abc =5 //エラー
var def= 10 //エラー
Ambiguous use of '***'
不確かな'***'の使われ方
【確認ver】Swift 3.0.2【語】ambiguous 曖昧な 不確かな【解決に文法がからむ度】★★★★★あるものがアクセス可能な範囲内の2箇所で定義されていて、どちらを呼び出せば良いかわからないときなどに出る。
//Swift 3.0.2
func funcB() {
}
func funcB() -> String {
return "RETURN"
}
class A {
func funcA() {
funcB() //エラー
}
}
どっちのfuncB()かわからない//Swift 3.0.2
func abc() -> Int {
return 0
}
func abc() -> String {
return "abc"
}
abc()
どっちのabc()かわからない//Swift 3.1
let a = Int(pow(2, 2)) //エラー
powの引数はDoubleとFloatとCGFloatがあるのでStatic member 'A***' cannot be used on instance of type 'B***'
staticなメンバA***はB***型のインスタンスとして使えません
【確認ver】Swift 3.1【コンパイラが判断してくれてもいいんじゃないか度】★★★タイプ変数をインスタンスメソッド内で型名を付けずに使うと出る。
//3.1
class SomeClass {
static var a: Int = 0
func testFunc() {
a = 10 //エラー
print(a) //エラー
}
static func testStaticFunc() {
a = 10 //エラーなし
print(a) //エラーなし
}
}
インスタンスメソッド内でタイプ変数aを使うときはSomeClass.aとするとOKclass宣言した変数にもこのメッセージが出る。
Instance member 'A***' cannot be used on type 'B***'
インスタンスメンバのA***はB***型(のクラスメソッド内)では使えません
【確認ver】Swift 3.1//3.1
class SomeClass {
var b: Int = 0
static func testStaticFunc() {
print(b) //エラー
}
}
クラスメソッドではインスタンス変数は使えない。Use of local variable '〜' before its declaration
'〜'というローカル変数を宣言前に使おうとしている
【確認ver】Swift 3.0.1//Swift 3.0.1
class A {
static var a = 0
static func aFunc() {
a = 1 //エラー
var a = 0
}
}
static var aが使えるはずであるが、下にvar aが宣言されているので、使おうとしているのは下のaではないかと判断している? 面白いエラー。Nil cannot be assigned to type '***'
nilを***に代入できません
【確認ver】Swift 3.1//3.1
var a = "abc"
a = nil //エラー
nilを入れるならoptional型にしないとだめInitialization of variable '***' was never used; consider replacing with assignment to '_' or removing it
変数の初期化(された値)は使われません。削除するか_を使ってみるのはどうですか?
【確認ver】Swift 3.1//3.1
var a = 0
Variable '***' was never used: consider replacing with '_' or removing it
変数***は使われません。削除するか_を使ってみるのはどうですか?
【確認ver】Swift 3.1//3.1
for var i in 0...10 {
}
Variable '***' was written to, but never read
変数***は書かれましたが読んでいません。
【確認ver】Swift 3.1readはリード?レッド?neverの後にあるのでリード?レッドならbe readか?
//3.1
for var j in 0...10 {
j = 0
}
型の互換性、プロトコルへの準拠
Cannot convert value of type 'A***' to specified type 'B***'
A型は、B型で指定されているものに変換できません
【確認ver】Swift 3.0.2//Swift 3.0.2
var abc: Int16 = 100
var abc2: Int8 = abc //エラー
数値同士の異なる型への代入。Int8(abc)を使えばOK。Int8の範囲を超えていた場合は実行時エラー。//Swift 3.0.2
var abc: Int8 = 100
var abc2: Int16 = abc //エラー
大きい方への変換も不可。Int16(abc)を使えばOK。//Swift 3.0.2
var abc: Int = 3.1415 //エラーあり
var abc8: Int8 = 3.1415 //エラーあり
var abc16: Int16 = 3.1415 //エラーあり
var abc32: Int32 = 3.1415 //エラーあり
var abc64: Int64 = 3.1415 //エラーあり
doubleリテラル表現からInt系への代入もだめ//Swift 3.0.2
var a: Character = "aa" //エラー
var b: Character = "" //エラー
var c: Character = "a" //OK
var d: Character = 'a' //Single-quoted string literal found, use '"' ('の代わりに"を使ってください)
StringとCharacterの変換//Swift 3.0.2
var abc:(Int, String) = (1, "A", 10) //エラー
var abc:(Int, String) = (1, 5) //エラー
タプルの要素違い//Swift 3.1
let rangeTest: CountableRange = 1.2...3.4 //エラー
Doubleはカウンタブルではない。//Swift 3.1
func abc(a: Int...) {
let b: Int = a //エラー Cannot convert value of type '[Int]' to specified type 'Int'
let c: [Int] = a //エラーなし
abc2(a: a) //エラー Cannot convert value of type '[Int]' to expressed argument type 'Int'
abc3(a: a) //エラーなし
}
func abc2(a: Int) {
}
func abc3(a: [Int]) {
}
可変長引数の扱いは配列で行う。Cannot convert value of type 'A***' to expected argument type 'B***'
A型は、期待されているB型の引数に変換できません
【確認ver】Swift 3.0.2//Swift 3.0.2
class Oya {
}
class Ko: Oya {
}
func funcA(a: Ko) {
}
funcA(Oya()) //エラー
//Swift 3.0.2
func abc<T>(a: T, b: T) -> T {
return a
}
let c = abc(a: 0, b: "あ") //エラー
0があるので、TはIntと判断されているCannot convert value of type 'A***' to type 'B***' in coercion
A型は、B型に強制変換できません
【確認ver】Swift 3.1【語】coercion 強制//3.1
var abc: Int8 = 100
var abc2 = abc as Int16 //エラー
asを使っても大きい方への変換でも不可。as!を使っても警告(always fails)。Int16(abc)を使えばOK。//3.1
var a: Double = 2.0
var b = a as Int
DoubleからIntへのas変換も不可、Int(a)を使えばOK。Cannot convert value of type 'A***' to expected element type 'B***'
A型は、想定されたB型の要素に変換できません
【確認ver】Swift 3.1//3.1
var abc: Array<Int> = [1, 2, "abc"] //エラー
配列の要素への代入時Cannot convert value of type 'A***' to expected dictionary value type 'B***'
A型は、辞書の想定されたB型の要素に変換できません
【確認ver】Swift 3.1//3.1
var abc: Dictionary<String, Int> = ["abc":3, "def":"a"] //エラー
辞書の要素への代入時'A***' is not convertible to 'B***'
A***をB***に変換できません
【確認ver】Swift 3.1//3.1
class Oya {
}
class Ko: Oya {
}
var a = Oya()
var b = a as Ko //エラー 'Oya' is not convertible to 'Ko'; did you mean to use 'as!' to force downcast?
var c = Oya()
var d: Ko = c //エラー Cannot convert value of type 'Oya' to specified type 'Ko'
var e = Ko()
var f = e as Oya //エラーなし
var g = Ko()
var h: Oya = g //エラーなし
//4.0
var abc:String = "Hello"
if abc { //エラー 'String' is not convertible to 'Bool'
}
//4.0
let i = 1
if i { //エラー 'Int' is not convertible to 'Bool'
}
nil is not compatible with expected argument type '***'
nilから、想定される引数のIntに互換性がありません
【確認ver】Swift 3.1//3.1
func funcA(a: Int) {
}
funcA(a: nil) //エラー
Cast from 'A***' to unrelated type 'B***' always fails
A***から関連性のないB***へのキャストは常に失敗します
【確認ver】Swift 3.1//3.1
var a: Int = 5
var b = a as? Double //警告
var c = a as! Double //警告
//3.1
var a = 5
if a is Double { //警告
}
コレクション(Array、Dictionary)(配列、辞書)
Variable/Constant '***' passed by reference before being initialized
'***'は初期化前に参照されました
【確認ver】Swift 4.0//4.0
var abcArray: [String]
abcArray.append("a") //エラー
初期化前に要素を追加しようとした場合宣言時にvar abcArray: [String] = []とすることで初期化出来る。ここで言う初期化はインスタンス化の意味で使われている。
配列には「宣言しただけで初期化していない状態」と、「初期化した状態」があるので、初期化済みか意識することが必要。
Expected '>' to complete generic argument list
ジェネリックの指定リストを決定するための>が必要
【確認ver】Swift 4.0//4.0
var abc: Dictionary<String: Int> = ["abc":3, "def":4] //エラー
<String: Int>でなく<String, Int>が正しいGeneric type 'Dictionary' specialized with too few type parameters (got 1, but expected 2)
辞書型のジェネリックが少ないパラメータで指定されている(2つ必要なのに1つしかない)
【確認ver】Swift 4.0//4.0
var abc: Dictionary<Int> //エラー
Expected ':' in dictionary literal
辞書表現で:が必要
【確認ver】Swift 4.0//4.0
var dict = [
"a": 1,
"b": 2,
3,4,5,6 //エラー
]//エラー
Mutating method 'append' may not be used on immutable value '***'
変更するメソッドのappendは変更できない値には使えません
【確認ver】Swift 4.0//4.0
class ABC {
let abcArray: [Int]
init() {
abcArray = []
abcArray.append(5) //エラー
}
}
let変数の初期化設定をinit()の中で2回以上行えるかどうかはバージョンによって迷いがあり、この例のような書き方を許可するバージョンもあった。Swift1.2では禁止されている。対応は、var変数にするか、一行で初期化を行うかにする。
Reference to generic type 'Array' requires arguments in <...>
ジェネリックタイプのArrayへの参照は<...>の中身が必要
【確認ver】Swift 4.0//4.0
var contents: Array //エラー
var contents2: Array<String>// エラー出ない
Contextual type '***' cannot be used with array literal
配列表現と文脈上の***型は一緒に使えません
【確認ver】Swift 3.1【語】Contextual 文脈上の 文脈からの 背景の 背景的な漠然としたメッセージなのである程度エラー原因を推測することが必要か。
//4.0
func variableFunc(a: Int, b: Int...) {
}
func testFunc() {
variableFunc(a: 4, b: [4, 4]) //エラー
}
b: 4, 4とするとOK//3.1
var a = [1,2,3]
a[1] = [10,11,12] //エラー
配列の要素の置き換えは、左辺を、配列名[範囲]で指定すること。この場合、a[1...1]とするとよい。//3.1
func abc(a: Int...) {
print("a")
}
abc(a: [1,2,3,4,5]) //エラー
可変長引数に渡すときは配列にしないでバラで渡す。Heterogeneous collection literal could only be inferred to '***'; add explicit type annotation if this is intentional
コレクションの表現が、異なるものが混ざったものである場合、***と推測されます。これが意図するものである場合、明確な型の指定を加えてください。
【確認ver】Swift 3.0.1【語】Heterogeneous 異種の***には[Any]が入ることが多い。
//Swift 3.0.1
let a = [ //エラー
"first" : 1,
"second" : "あいう"
]
[String : Any]をはっきりと指定するとOK。//3.1
let a = [1, "a"]
[Any]をはっきりと指定するとOK。Ambiguous reference to member 'subscript'
subscriptというメンバーへの曖昧な参照
【確認ver】Swift 3.0.1【語】Ambiguous 曖昧な//Swift 3.0.1
let myParagraph = NSMutableParagraphStyle()
myParagraph.alignment = .center
let myFontAttributes: [String : AnyObject] = [
NSParagraphStyleAttributeName : myParagraph
]
myFontAttributes[NSParagraphStyleAttributeName].alignment = .left //エラー
myFontAttributes[NSParagraphStyleAttributeName]?.alignment = .leftでもエラー。
(myFontAttributes[NSParagraphStyleAttributeName] as? NSMutableParagraphStyle)?.alignment = .left
にするとエラーは出ないが、もう少しシンプルな方法がありそうな気もする。
'+' is unavailable: Operator '+' cannot be used to append a String to a sequence of strings
+は使えません。+演算子はStringをStringシーケンスに追加するのに使えません。
【確認ver】Swift 4.0//Swift 4.0
var lunch = ["hamburger", "potato", "cola"] + "cheeseburger" //エラー
セットに単品をプラスは出来ない。lunch.append("cheeseburger")を使うと可能。
関数(function)、メソッド(method)
Extra argument in call
引数が多すぎる
【確認ver】Swift 3.0.2関数、メソッドの実行文で引数が多すぎるときに出る。
//Swift 3.0.2
func abc(a: Int) {
}
let a = 3
let b = 3
abc(a: a, b) //エラー
Expression resolves to an unused function
使われない関数として判断しました
【確認ver】Swift 3.0.2//Swift 3.0.2
print
//Swift 3.0.2
func testValArg(a: Int...) {
}
testValArg(a: ) //エラー
可変長引数に渡す引数が0個のときは外部引数名もいらない。Missing argument for parameter '***' in call
パラメータ'***'という引数がありません
呼び出し文で引数が足りない。'***'は#1などと書かれる。これは1番目の引数の意味かと思われる。【確認ver】Swift 3.0.2
//Swift 3.0.2
class Oya {
init(a: Int) {
}
}
class Ko: Oya {
init() {
super.init()
}
}
親クラスでinit(abc: Int)しか定義していないのに子クラスからsuper.init()と呼び出した//Swift 3.0.2
func aFunc(a: Int) {
}
aFunc() //エラー
引数が必要な関数を、引数を与えずに呼び出した。//Swift 3.1
func aFunc(a: Int = 0) -> Bool {
return true
}
let a = aFunc() //OK
print(a) //true
let bFunc = aFunc
let b = bFunc() //エラー
print(b)
デフォルトが効かない。Missing argument label '***':in call
引数ラベルの'***'がありません
【確認ver】Swift 3.0.2関数の定義などで引数にラベルが付いている(要求している)が、呼び出す側では書かれていない。コンスストラクタ呼び出しでも同様の状況で出ます。
//Swift 3.0.2
class ABC {
func abcFunc(a: Int, b: Int){
}
}
var abc: ABC = ABC()
abc.abcFunc(4, 1) //エラー
ラベルが必要Extraneous argument label '***:' in call
呼び出し文で余計なラベル'***:'
【確認ver】Swift 3.0.2【語】extraneous 無関係の、異質の//Swift 3.0.2
func func123(a: Bool, _ b: Bool, _ c: Bool, _ d: Bool) {
//何かの処理
}
func123(a:true, b: true, c: true, d: true) //エラー
ラベル省略方式で定義されているもの//Swift 3.0.2
func testFunc(a: Int) {
print("a")
}
let delayFunc: (Int) -> Void = testFunc(a: )
delayFunc(a: 0) //エラー
let clo = {
(a: Int) -> Bool in
if a == 0 {
return true
} else {
return false
}
}
let result = clo(a: 1) //エラー
この場合はdelayFuncやcloの実行時の外部引数名がいらないそうな。Incorrect argument label in call (have '***', expected '***')
引数のラベルが間違っている。expected以下が求められているもの。
【確認ver】Swift 4.0//4.0
var a = ABC()
a.abcFunc(a: 3, b: 5) //エラー
class ABC {
func abcFunc(aa a: Int, bb b: Int){
}
}
aaとbbが指定してあるのでそれを使わないといけない。'&' used with non-inout argument of type '***'
&が非inoutの***型の引数に使われています
【確認ver】Swift 4.0//4.0
func abc(a: Int) {
}
let a = 3
abc(&a) //エラー
Single argument function types require parentheses
関数の引数がひとつのときでも()が必要
【確認ver】Swift 3.1//3.1
func abc(a: Int -> Int) {
}
(Int) -> Intにしましょう。Expected '{' in body of function declaration
関数の定義に{がありません
【確認ver】Swift 4.0//4.0
public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int //エラー
protocolの定義から実装部にコピーアンドペーストしただけの状態//4.0
func abc () String { //エラー
return "a"
}
Stringの前に->がないMissing return in a function expected to return '***'
***を返す関数なのに、戻り値がない
【確認ver】Swift 4.0//4.0
func aFunc() -> Int {
} //エラー
Int型の値をreturnしないといけない//4.0
class A {
var a: Int {
get { b * b } //エラー
}
var b: Int = 0
}
returnが必要。//4.0
class A {
var a: Int {
b * b
} //エラー
var b: Int = 0
}
returnが必要。Unexpected non-void return value in void function
値を返さない関数内で戻り値が書かれている
【確認ver】Swift 4.0//4.0
func aFunc() {
return 0 //エラー
}
//4.0
func abc() {
return nil //エラー
}
return nilを書いた時もこのエラーメッセージになるCannot convert return expression of type 'A***' to return type 'B***'
戻り値として書かれているA***型は、本来の戻り値であるB***型に変換出来ません
【確認ver】Swift 4.0戻り値の型が違う。
//4.0
func aFunc() -> Int {
return "もどり" //エラー
}
Static properties may only be declared on a type
staticプロパティは型のプロパティにのみ宣言出来ます
【確認ver】Swift 3.0.2//Swift 3.0.2
func staticTestFunc() {
static var abc = 0 //エラー
}
関数/メソッド内の変数にstaticをつけた。関数/メソッド内で保持する値をどう宣言すればいいかは要調査。→どうやらC言語の関数内staticにあたるものはない模様。
//Swift 3.0.2
//トップレベルで
static var abc: Int = 0 //エラー
Cannot invoke '***' with an argument list of type '(***, ***)'
与えられた引数の組み合わせでは関数を実行出来ない
【確認ver】Swift 4.0【語】invoke (プログラムなどを)呼び出す//4.0
abs(1,2) //エラー
Cannot invoke '***' with no arguments
引数なしでは関数を実行出来ない
【確認ver】Swift 4.0【語】invoke (プログラムなどを)呼び出す//4.0
abs() //エラー
Argument passed to call that takes no arguments
引数を持たない関数/メソッドに引数が渡されました
【確認ver】Swift 3.0//Swift 3.0
func testFuncA() {
}
testFuncA(a: 100)//エラー
Only a single variadic parameter '...' is permitted
可変長引数に出来るのはひとつだけです
【確認ver】Swift 3.0.2//Swift 3.0
func testValArgFunc(a: Int..., b: Int...) { //エラー
}
2つあってはだめ。Result of call to '***' is unused
***を呼んだ結果が使われていません
【確認ver】Swift 3.0.2//Swift 3.0.2
abc() //ワーニング
func abc() -> Int {
return 1234
}
結果が使われていない。結果とはメソッドの戻り値のことで、この場合はIntの1234結果を使わない場合は
_ = abc()
とするとワーニングが消える。
クラスと構造体
Value of type 'A***' has no member 'B***'
AはBというメンバを持っていません
【確認ver】Swift 3.1//3.1
//クラスの定義
class ABC {
var a = 0
}
//呼び出し部
var a = ABC()
var b = a.b //エラー
存在しないメンバ(b)にアクセスしたときに出る。//3.1
//クラスの定義
class ABC {
var a = 0
}
//呼び出し部
var a = ABC()
a.someMethod() //エラー
存在しないメソッドを呼び出そうとしたときにも出る。Class '***' has no initializers
***はイニシャライザを持っていません
【確認ver】Swift 3.1class ABC { //エラー
var a: Int
}
初期値を与えれば消えます。また、型名の後ろに!か?をつければこのエラーは消えます。このやり方は初期化やオプション型を理解していないと危険。
Method does not override any method from its superclass
(そのやり方では)スーパークラスのメソッドにオーバーライド出来るものはありません
【確認ver】Swift 3.1メソッドをオーバーライドしようとしたときに、スーパークラスにそのメソッドがないか、引数や戻り値の組み合わせが違うか、必要なスーパークラスの継承が出来ていない。
//3.1
class Oya {
func aFunc() {
}
}
class Ko: Oya {
override func aFunc(a: Int) { //エラー
}
}
//3.1
class ClassExtensionTest {
func funcExtensionTest() {
}
}
extension ClassExtensionTest {
override func funcExtensionTest() { //エラー
}
override func funcExtensionTest2() { //エラー
}
}
extensionでは既存のものを再定義出来ないし、新規のものはoverrideつけなくていい。Property does not override any property from its superclass
(そのやり方では)スーパークラスのプロパティにオーバーライド出来るものはありません
【確認ver】Swift 3.1プロパティをオーバーライド(つまり演算プロパティのget setで上書きしようとしている)しようとしたときに、スーパークラスにそのプロパティがないか、必要なスーパークラスの継承が出来ていない。
//3.1
class Oya {
var a: Double = 0.0
}
class Ko: Oya {
override var b: Double {
get {
return a / 1000.0
}
set {
a = newValue * 1000.0
}
}
}
'super' members cannot be referenced in a root class
'super'はルートクラスでは参照されません
【確認ver】Swift 4.0実行したクラスはルートクラス(親クラスをもたない)になっている。
//4.0
class Ichininmae {
func aFunc() {
super.aFunc() //エラー
}
}
'***' can only be specified on class members
***はクラスメンバに対してのみ、つけることが出来ます
【確認ver】Swift 3.1***の対象となるのはoverride
//3.1
//トップレベルで
override func aFunc() { //エラー
}
書かれているところがクラスの定義の外側'***' cannot be used outside of class members
***はクラスメンバの外では使えません
【確認ver】Swift 3.1書かれているところがクラスの定義の外側
***に当てはまるのはsuper
//3.1
//トップレベルで
func abc(a: Int) {
super.someFunc()
}
Keyword 'init' cannot be used as an identifier here
initキーワードはここで識別子として使えません
【確認ver】Swift 4.0//4.0
class A {
func init() {
}
}
initにfuncキーワードをつけた。initにはfuncはいらない。funcをつけたせいでfuncの後にinit以外の名前を要求している。Expected '(' in argument list of function declaration
関数の宣言の引数のリストで(が期待される
【確認ver】Swift 4.0引数のリストは()の中に書く。引数がなくても()は書く事。
//4.0
func aFunc { //エラー
}
()を忘れたFound an unexpected second identifier in function declaration; is there an accidental break?
関数の宣言で2つめの識別子が見つかりました。空白が入っていませんか?
【確認ver】Swift 4.0//4.0
func override abc() { //エラー
}
overrideの場所が違う。overrideはこの場合、先頭にする。funcがあるせいでoverrideを関数名と解釈しようとする。//4.0
func mutating change() { //エラー
}
mutatingの場所が違う。mutatingはこの場合、先頭。funcがあるせいでmutatingを関数名と解釈しようとする。Consecutive declarations on a line must be separated by ';'
Expected '{' in body of function declaration
Expected '(' in argument list of function declaration
一行に連続して宣言を書く時は;で区切って下さい
関数の宣言で{が期待される
関数の宣言の引数のリストで(が期待される
【確認ver】Swift 4.0func override init() {
}
init()にはfuncがいらない。funcがあるせいでoverrideが関数名と解釈しようとする。'mutating' isn't valid on methods in classes or class-bound protocols
mutatingはクラスのメソッドに使えません(structやenumのメソッドに使うものです)
【確認ver】Swift 4.0//4.0
class A {
mutating func aFunc() { //エラー
}
}
Cannot assign to property: '***' is a 'let' constant
プロパティに代入することは出来ません。***は定数です。
【確認ver】Swift 4.0//4.0
class A {
let a: Int = 0
func funcA() {
a = 0 //エラー
}
}
値を入れようとしているメンバがletで宣言してある//4.0
let abc = (1, "A")
abc.1 = "B" //エラー
abcがletなのでその要素も変更はだめ//4.0
class Oya {
let a: Int
init() {
a = 0
}
}
class Ko: Oya {
override init() {
super.init()
a = 1
}
}
letで宣言してある定数の初期化をサブクラスのイニシャライザーで行おうとしている//4.0
struct AStruct {
var a: Int = 0
}
func testFunc() {
let aStruct = AStruct()
aStruct.a = 1 //エラー
}
構造体がlet宣言の場合、そのメンバ変数もlet扱い。(構造体でなくクラスのlet宣言の場合はメンバ変数の変更は可能)Cannot assign to property: '***' is a get only property
プロパティに代入することは出来ません。***は読み込み専用変数です。
【確認ver】Swift 4.0//4.0
class AAA {
var a: Int {
get {
return 5
}
}
}
var aaa = AAA()
aaa.a = 3//エラー
Cannot use mutating member on immutable value: '***' is a 'let' constant
変更出来ない値の***のmutatingメンバを使うことは出来ません。***はlet定数です。
【確認ver】Swift 4.0//4.0
struct StructA {
var a: Int = 0
mutating func funcA() {
a = a + 1
}
}
let strA = StructA()
strA.funcA() //エラー
構造体Aが自身の値を変更するmutating付きのメソッドBを持つとき、let宣言したその構造体AのインスタンスからこのメソッドBを呼び出すと出る。Cannot use mutating member on immutable value of type '[***]'
変更出来ない値の[***]のmutatingメンバを使うことは出来ません
【確認ver】Swift 4.0//4.0
let lunch = ["hamburger", "potato", "cola"].append("cheeseburger") //エラー
//OK
var lunch = ["hamburger", "potato", "cola"]
lunch.append("cheeseburger")
'class var' declaration requires an initializer expression or getter/setter specifier
class付きクラス変数の宣言では初期化処理か、getter/setterが求められます
【確認ver】Swift 4.0演算プロパティの場合はclassでよいが、ストアドプロパティの場合はstaticを用いるべき(classとstaticの違いが発生しないので使用するのはstaticのみ)。
//4.0
class SomeClass {
class var classProperty: Int { //エラー
}
}
演算プロパティかストアドプロパティかどっちにしても中途半端な状態'static var' declaration requires an initializer expression or getter/setter specifier
static付きクラス変数の宣言では初期化処理か、getter/setterが求められます
【確認ver】Swift 4.0//4.0
class SomeClass {
static var classProperty: Int //エラー
}
初期値を与えればエラーが消える//4.0
class SomeClass {
static var classProperty: Int { //エラー
}
}
演算プロパティかストアドプロパティかどっちにしても中途半端な状態Class stored properties not supported in classes; did you mean 'static'?
class(指定子をつけた)ストアドプロパティはサポートされていません。static(これは使用可)のつもりですか
【確認ver】Swift 4.0//4.0
class SomeClass {
class var classStoredProperty: Int = 0 //エラー、staticならOK
class var classComputedProperty: Int { //エラー、getやsetの中身を書けばOK
}
}
classStoredPropertyはストアドプロパティにclassが付いているのでエラーclassComputedPropertyはgetter/setterがないのでストアドプロパティの可能性があると判断されてエラー
Cannot assign to 'self' in a method
メソッド内でselfに代入することは出来ません
【確認ver】Swift 4.0//4.0
class ClassA {
func funcA() {
self = ClassA() //エラー
}
}
Cannot assign to property: 'self' is immutable
プロパティに代入することは出来ません。selfは変更出来ません。
【確認ver】Swift 4.0//4.0
struct ABC{
var a: Int
var b: Int
func change(){
let c = a
a = b //エラー
b = c //エラー
}
}
構造体の定義の中で構造体の要素に代入しているfuncの前にmutatingをつければOK
Initializer 初期化メソッド
Return from initializer without initializing all stored properties
すべての格納プロパティの初期値設定が完了しないまま初期化メソッドを終わろうとしています(出来ていないものがひとつはある)
【確認ver】Swift 3.1//3.1
class ABC {
var abc: Int
init(){
}
}
abcの初期値を入れていない。対応は、宣言時に=0するか、init()の中でabc = 0などをする。
Cannot use optional chaining on non-optional value of type '() -> ***?'
() -> ***?という非オプショナルタイプにオプショナルチェイニングを使うことは出来ません
【確認ver】Swift 3.1//3.1
class ABC {
init? () {
return nil
}
}
class DEF: ABC {
override init? () {
super.init?() //エラー
return nil
}
}
失敗の可能性のあるイニシャライザinit?を定義して、それをサブクラスから呼ぶときにinit?のように?をつけて呼んでしまった時に出た。呼ぶときには?はいらない。Failable initializer 'init()' cannot override a non-failable initializer
失敗の可能性のあるイニシャライザ'init()'で失敗の可能性の無いイニシャライザをオーバーライドすることは出来ません
【確認ver】Swift 3.1//3.1
class ABC {
init () {
}
}
class DEF: ABC {
override init?() { //エラー
super.init()
}
}
メッセージはinit?()と?付きにしたほうがわかりやすいですけどA non-failable initializer cannot chain to failable initializer 'init(***)' written with 'init?'
失敗の可能性の無いイニシャライザinit(***)から、init?で書かれた失敗の可能性のあるイニシャライザを呼ぶことは出来ません
【確認ver】Swift 3.1//3.1
class ABC {
init? () {
return nil
}
}
class DEF: ABC {
override init () {
super.init() //エラー
}
}
'required' modifier must be present on all overrides of a required initializer
required initializerをオーバーライドする際は、'required'修飾語を付けないといけない
【確認ver】Swift 4.0requiredを付けたイニシャライザはサブクラスを作った際に実装(オーバーライド)しないといけない。そして、次のサブクラスでも実装させるためにそれもまたrequiredをつけないとだめ。
//4.0
class ABC {
required init() {
}
}
class DEF: ABC {
init() { //エラー
}
}
Use the 'required' modifier to override a required initializer
requiredを付けたイニシャライザをオーバライドするときはrequiredを付けること
【確認ver】Swift 4.0//4.0
class ABC {
required init() {
}
}
class DEF: ABC {
override init () { //エラー
}
}
overrideを付けたときに出た。overrideではなくrequiredを付けないとだめ。'required' may only be used on 'init' declarations
requiredはinitにしか使えません
【確認ver】Swift 4.0//4.0
class ABC {
required func abcFunc() { //エラー
}
}
'self' used before all stored properties are initialized
全てのストアドプロパティが初期化される前に、selfが使われています
【確認ver】Swift 4.0//4.0
class A {
let aa: AA!
init() {
self.aa = AA(a: self) //エラー
}
}
class AA {
unowned let a: A
init(a: A) {
self.a = a
}
}
Initializers may only be declared within a type
初期化メソッドは型の中にのみで宣言出来ます
【確認ver】Swift 4.0//4.0
init() {
}
トップレベルにinit(){}を書いた//4.0
class A {
func abc() {
init() {
}
}
}
関数の中など書くべきでないところでinit(){}を書いたMissing 'self.' at initializer invocation
他の初期化メソッド呼び出しでself.が抜けている
【確認ver】Swift 4.0//4.0
class A {
convenience init(a: Int) {
init()
}
init() {
}
}
self.init()のself.が抜けている場合Missing 'super.' at initializer invocation
他の初期化メソッド呼び出しでsuper.が抜けている
【確認ver】Swift 4.0//4.0
class A {
init(a: Int) {
init() //エラー
}
init() {
}
}
super.init()のsuper.が抜けている場合か、convenienceとself.が抜けている場合。Designated initializer for 'A***' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer?
A***型の指定イニシャライザーはself.initを呼ぶことが出来ません。やりたいことはコンビニエンスイニシャライザーにすることで出来ませんか?
【確認ver】Swift 4.0同じ型の中で指定イニシャライザーから指定イニシャライザーを呼ぶことは出来ない。
コンビニエンスイニシャライザーから指定イニシャライザーを呼ぶことは出来るので、コンビニエンスイニシャライザーにしてはどうかとおすすめされる。
//4.0
class A {
init() { //エラー
self.init(a: 0)
}
init(a: Int) {
}
}
Must call a designated initializer of the superclasss '***'
スーバークラス***のdesignatedイニシャライザーを呼ばないといけません
【確認ver】Swift 4.0//4.0
class TestView: UIView {
init() {
super.init()
}
}
UIViewのinit()はdesignatedイニシャライザーではない。とりあえずインスタンスを作るだけなら、designatedイニシャライザーがおすすめ。super.init(frame: CGRect())など。
'required' initializer 'A***' must be provided by subclass of 'B***'
requiredイニシャライザー'A***'はサブクラス'B***'で提供されないと(実装しないと)いけない
【確認ver】Swift 4.0サブクラスでinitメソッドをひとつも書かない場合は免除される模様
//4.0
class TestView: UIView {
init() {
super.init()
}
} //エラー
UIViewはinit(coder:)がrequiredなのでこれも書かないといけない。Use of 'self' in method call '***' before all stored properties are initialized
***を呼び出す時にselfを使っているが、すべての格納プロパティが初期化される前である
【確認ver】Swift 4.0//4.0
class A {
let a: Int
init() {
self.aFunc() //エラー
a = 0
}
func aFunc() {
}
}
Self.init isn't called on all paths before returning from initializer
初期化の経路の中にself.initが呼ばれない経路があります
【確認ver】Swift 4.0convenience初期化メソッドからはdesignated初期化メソッドを呼ばないといけない
//4.0
class A {
var a: Int
init(aa: Int) {
a = aa
}
convenience init() {
} //エラー
}
Iinitializer does not override a designated initializer from its superclass
親のdesignated初期化メソッドをオーバーライドしていません
【確認ver】Swift 4.0superのconvenienceをオーバーライドした時に出る。
初期化メソッドはdesignatedとconvenienceがある。オーバーライドされることが出来るのはdesignatedのみ。このときoverrideを付ける。つまりinitにoverrideをつけた場合はそのinitはdesignatedである必要がある。しかし、それがconvenienceの場合は矛盾するのでこのメッセージが出る。
//4.0
class Oya {
var a: Int
convenience init() {
self.init(a: 0)
}
init(a: Int) {
self.a = a
}
}
class Ko: Oya {
override init() { //エラー
}
override init(a: Int) { //エラーなし
super.init(a: a)
}
}
Unexpected initializer in pattern: did you mean to use '='
想定されない初期化のパターン、=を使ってはどうか
【確認ver】Swift 3.0.1初期化が不完全な時に出る。
//Swift 3.0.1
let a:
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { //エラー
}
let a:と書いてあるのでコンパイラはaの型を要求しているが、プログラムは次のプログラムに行っている。'override' is implied when overriding a required initializer
requiredイニシャライザーをオーバーライドするときにはoverrideは書かなくてもよい
【確認ver】Swift 4.0requiredがあれば十分。
//Swift 4.0
class Oya {
required init() {
}
}
class Ko: Oya {
override required init() {
}
}
enum
Expected identifier in enum 'case' declaration
enumのcaseの宣言が正しくない
【確認ver】Swift 4.0//4.0
enum BloodType {
case //エラー
}
Extraneous '.' in enum 'case' declaration
enumのcase定義に余計な.(ドット)
【確認ver】Swift 4.0【語】Extraneous 余計な//4.0
enum BloodType {
case .A //エラー
case .B //エラー
case .AB //エラー
case .O //エラー
}
enum中のcaseの次には.(ドット)がいらない(switch中のcaseの後にenumの各要素を書くときには必要です)Enum case cannot have a raw value if the enum does not have a raw type
生データ持ちとして定義していないenumのcaseでは生データを持つことは出来ません
【確認ver】Swift 4.0【語】raw 生の//4.0
enum BloodType {
case A = 0 //エラー
case B
case AB
case O
}
=0をなくすか、enum BloodType: IntとすればOKEnum with raw type cannot have cases with arguments
生データ持ちのEnumは引数付きの要素を持つことが出来ない。
【確認ver】Swift 4.0//4.0
enum TestEnum: Int { //別エラー
case testUnionS(String) //エラー
case testUnionI(Int) //エラー
}
Enum case must declare a raw value when the preceding raw value is not an integer
前の要素の生データが整数で無い場合は生データを宣言する必要があります
【確認ver】Swift 4.0【語】preceding 前のSwift2.0あたりの仕様変更でDoubleのときでもIntの時と同じようにデフォルト値が与えられるようになったのでメッセージは修正の必要があります。
//4.0
enum TDFK: Double { //別エラー
case Hok //エラーではない
case Aom //エラーではない
case Iwa = 5 //エラーではない
case Aki //エラーではない
case Miy = 10.0 //エラーではない
case Yam //エラー
case Fuk
}
Hokは指定値0で、0.0が設定される。Aomは指定値1で、1.0が設定される。
Iwaは指定値5で、5.0が設定される。
Akiは指定値6で、6.0が設定される。
Miyは指定値10.0で、10.0が設定される。
Yamは前の指定値が整数ではないのでエラー。
enum BloodType: String {
case A = "abc"
case B //エラーではない。生データは"B"になる
case AB
case O
}
Stringの場合はエラーではない。要素名が生データとして採用される。この場合は"B" "AB" "O"。'case' label can only appear inside a 'switch' statement
caseラベルはswitch文の中だけに書くことが可能です
【確認ver】Swift 4.0これはenum宣言中のcaseにコロンを付けてしまったときに出てきます。
//4.0
enum BloodType {
case A: //エラー
case B: //エラー
case AB: //エラー
case O: //エラー
}
この場合コロンを外すだけでOKです。コロンなしのcase行が正しいです。このメッセージですが、ラベルというのはコロンを付けた状態のことを言っています。
Raw value for enum case is not unique
enumの生データに重複があります
【確認ver】Swift 4.0//4.0
enum TestEnum: Int {
case test1 = 0
case test2 = 0 //エラー
}
2つの要素に0を与えているのでエラー。'default' label can only appear inside a 'switch' statement
defaultラベルはswitchの中でのみ使えます
【確認ver】Swift 4.0//4.0
switch myBlood {
case A:
//何か
case B:
//何か
}
default: //エラー
Enums may not contain stored properties
Enumはストアドプロパティを含むべきでない
【確認ver】Swift 4.0//4.0
enum BloodType {
let A: Int = 0 //エラー
let B: Int = 1 //エラー
let AB: Int = 2 //エラー
let O: Int = 3 //エラー
}
そもそも宣言方法が違う。letではなくcaseを使うのが正しい。Raw type '***' must appear first in the enum inheritance clause
enumの継承節で生データ***は初めに現れないといけない
【確認ver】Swift 4.0//4.0
enum TestEnumUnion: CustomStringConvertible, Int { //4.0
case a = 0
var description: String {
return "test"
}
}
An enum with no cases cannot declare a raw type
caseを持たないenumはrawの型を宣言できません
【確認ver】Swift 4.0//4.0
enum TestEnumUnion: Int {
}
まだcaseを書いていない。Recursive enum '***' is not marked 'indirect'
再帰的なenum***にindirectが付いてない
【確認ver】Swift 4.0//4.0
//悪い例
enum TestEnumRe { //エラー
case TestEnumRe1(Int)
case TestEnumRe2(TestEnumRe)
}
//正しい例
enum TestEnumRe {
case TestEnumRe1(Int)
indirect case TestEnumRe2(TestEnumRe) //OK
}
'A***' declares raw type 'B***', but does not conform to RawRepresentable and conformance could not be synthesized
Aはrawの型としてBを宣言しています。しかしBはRawRepresentableに準拠してません。rawの設定は出来ません。
【確認ver】Swift 4.0//4.0
enum BloodType: Character { //エラー
case A //別エラー
case B
case AB
case O
}
//4.0
enum TestEnum: Int { //エラー
case testUnionS(String) //別エラー
case testUnionI(Int) //別エラー
}
//4.0
enum TDFK: Double { //エラー
case Hok //エラーではない
case Aom //エラーではない
case Iwa = 5 //エラーではない
case Aki //エラーではない
case Miy = 10.0 //エラーではない
case Yam //別エラー Enum case must declare a raw value when the preceding raw value is not an integer
case Fuk
}
//4.0
enum TestEnumUnion: Int { //エラー
}
中身を何も書いていない。Enum cases require explicit raw values when the raw type is not expressible by integer or string literal
raw値の型が整数や文字列ではない場合、Enumのcaseは明確なraw値の設定が必要です。
【確認ver】Swift 4.0//4.0
enum BloodType: Character { //別エラー
case A //エラー
case B
case AB
case O
}
整数や文字列以外では明確にrawの値を指定すること。具体的にどんなのがあるかわからなかったのでCharacterでサンプルコードを作りました。
継承
Overriding declaration requires an 'override' keyword
(親で宣言してあるものを)オーバーライドする宣言はoverrideを付けることが必要
【確認ver】Swift 4.0//4.0
class A {
func aFunc() {
}
}
class B: A {
func aFunc() { //エラー
}
}
Cannot override with a stored property '***'
***というストアドプロパティはオーバーライド出来ません
【確認ver】Swift 4.0親クラスで宣言してあるプロパティ(ストアド、演算型の両方を含む)をストアドプロパティで再宣言(またはoverride)しようとした。
//4.0
class Oya {
var a: Int = 0
var b: Int {
get {
return a + 10
}
set {
self.a = newValue - 10
}
}
}
class Ko: Oya {
var a: Int = 0 //エラー overrideをつけても同じエラー
var b: Int = 0 //エラー overrideをつけても同じエラー
}
overrideするなら演算型で行うこと。Inheritance from a final class '***'
finalをつけたクラスから継承しようとしている
【確認ver】Swift 4.0finalをつけたクラスは下へ継承出来ない。
//4.0
final class ClassA {
}
class ClassAA: ClassA { //エラー
}
Var overrides a 'final' var
finalのvarはオーバーライド出来ません
【確認ver】Swift 4.0finalで宣言してあるプロパティ(ストアド、演算型の両方を含む)をサブクラスの演算プロパティでオーバーライドしようとした。finalされていなく、letでないものならそれを演算プロパティでオーバーライドすることは可能。
//4.0
class Oya {
final var a: Int = 0
final var b: Int {
get {
return self.a + 1
}
set {
self.a = newValue - 1
}
}
}
class Ko: Oya {
var base: Int = 0
override var a: Int { //エラー
get {
return self.base + 1
}
set {
self.base = newValue - 1
}
}
override var b: Int { //エラー
get {
return self.base + 2
}
set {
self.base = newValue - 2
}
}
}
Cannot override immutable 'let' property '***' with the getter of a 'var'
let宣言された変更できないプロパティ***をvar変数のgetterでオーバーライドすることは出来ません
【確認ver】Swift 4.0let宣言されたプロパティを、演算プロパティでオーバーライドしようとしたとき。
演算プロパティはvar扱いになるので、規制を緩める方向への変更になる。これを禁止しているのかと思われる。
サブクラス側をletで宣言すると演算プロパティに出来ない(演算プロパティはvarのみ)。演算プロパティに出来ないならオーバーライド出来ない。つまりlet宣言されたプロパティはオーバーライド出来ないということだろうか。
//4.0
class Oya {
let a: Int = 0
}
class Ko: Oya {
var base: Int = 0
override var a: Int { //エラー
get {
return self.base + 1
}
set {
self.base = newValue - 1
}
}
}
Instance method overrides a 'final' instance method
インスタンスメソッドがfinalで宣言してあるメソッドをオーバラードしようとしている
【確認ver】Swift 4.0finalで宣言してあるメソッドをサブクラスでオーバーライドしようとした。
//4.0
class Oya {
final func funcA() {
}
}
class Ko: Oya {
override func funcA() { //エラー
}
}
Cannot override static method
staticなメソッドはオーバーライド出来ない
【確認ver】Swift 4.0//4.0
class Oya {
static func funcStatic() {
}
}
class Ko: Oya {
override static func funcStatic() { //エラー
}
}
親クラスではstaticで宣言してある。これは意味的にはfinal。Class methods are only allowed within classes; use 'static' to declare a static method
クラスメソッドはクラスのみに使用できます。スタティックメソッドにはstaticを使って宣言してください。
【確認ver】Swift 4.0クラス内で宣言するものにはclassとstaticが使える。structとenumはstaticのみが使える。
classを付けたものは下のクラスで継承出来る。structとenumは継承の機能がないのでclassは使い道がない。
プロトコル内ではstaticのみ。プロトコルはstructやenumに付けられる可能性があるため。プロトコル内で宣言したstaticメソッドを、適用クラス内でclassで定義してもOK。
//4.0
struct A {
class func methodA() { //エラー
}
}
staticに変えるとOK//4.0
protocol A {
class func funcA(a: Int) //エラー
}
staticに変えるとOKプロトコルではstaticとなっていても、これを適用したクラスで、class func funcA(a: Int) {}と出来る。
Cannot override static var
staticのvarはオーバーライド出来ません
【確認ver】Swift 3.0.1//Swift 3.0.1
class A {
static var daihyo: A {
return A()
}
}
class B: A {
override static var daihyo: B { //エラー
return B()
}
}
Aの方のstaticをclassにするとOKCannot override mutable property '***' of type 'A***' with covariant type 'B***'
A型のプロパティ***は共変の(?)B型でオーバーライド出来ません
【確認ver】Swift 3.0.1【語】covariant 共変の//Swift 3.0.1
class A {
static var daihyo = A()
}
class B: A {
override static var daihyo: B {
return B()
}
}
Aのdaihyoをclassの演算プロパティにするとOKになる。protocol プロトコル
Type 'A***' does not conform to protocol 'B***'
A***という型はB***というプロトコルに適合していません
【確認ver】Swift 3.0.2【語】conform 適合するプロトコルが何か理解していないときは理解が必要です。これは少し時間がかかります。
//Swift 3.0.2
class ViewController: UIViewController, UIPickerViewDataSource {
//必要なメソッドが書かれていない
}
classの定義にUIPickerViewDataSourceプロトコルを付けたが、必要なメソッドを実装していない。//Swift 3.0.2
protocol ProtocolA {
func funcA()
}
struct StructA: ProtocolA { //エラー
mutating func funcA() {
//実装
}
}
プロトコル実装側で勝手にmutatingにしてはだめ。逆は許されるが。//Swift 3.0.2
protocol protocolA {
var a: Int { get set }
}
class ClassA: protocolA { //エラー
let a: Int = 0
}
class ClassAA: protocolA { //エラー
var a: Int {
get { return self.a }
}
}
プロトコルでget setで宣言されたものを実装側でletや読み取り専用にしてはだめ。逆にプロトコルではgetのみのものを、実装側で読み書き出来るようにするのはOK。
//Swift 3.0.2
protocol A {
}
protocol B: A {
associatedtype ASO: Equatable
}
class C: B { //エラー
typealias ASO = A
}
associatedtype ASO: Equatableの条件が満たされていない。//Swift 3.0.2
func abc<T>(a: Any) -> T? {
return a as? T
}
let aaa = abc(a: 0) //エラー Type 'Any' does not conform to protocol 'ExpressibleByIntegerLiteral'
let bbb = abc(a: "a") //エラーType 'Any' does not conform to protocol 'ExpressibleByUnicodeScalarLiteral'
let ccc = abc(a: "abc") //エラーType 'Any' does not conform to protocol 'ExpressibleByStringLiteral'
戻り値から推論するタイプのジェネリックファンクションで、戻り値から推論が出来ないときに、ファンクションの引数側に対してエラーが出る。//Swift 3.1
var rangeTest: CountableRange<Double> //エラー
Doubleはカウンタブルではない。Protocol methods may not have bodies
プロトコルの定義内に書かれているメソッドは中身を持ってはだめ
【確認ver】Swift 3.0.2プロトコルの定義内には名前と引数と戻り値のみを書く。
//Swift 3.0.2
protocol ABCProtocol {
func abc() { //エラー
}
}
Initial value is not allowed here
初期値はここに書かれるべきでない
【確認ver】Swift 3.0.2【語】allow 許す//Swift 3.0.2
protocol AProtocol {
var a: Int = 0 //エラー
}
プロトコルで初期値は受付ない。Property in protocol must have explicit { get } or { get set } specifier
プロトコル内のプロパティは明確に{ get } か { get set }をつけないとだめ
【確認ver】Swift 3.0.2【語】explicit 明確なgetやsetの中身はいらない。
//Swift 3.0.2
protocol AProtocol {
var a: Int //エラー
}
var a: Int { get }やvar a: Int { get set }
でOK。
Expected get or set in a protocol property
プロトコル定義内のプロパティにはgetやsetの想定された書き方がある
【確認ver】Swift 3.0.2{ get }や{ get set }が正しい
//Swift 3.0.2
protocol AProtocol {
var a: Int {
get { //エラー
}
}
}
getの中身を書こうとしているが、中身はプロトコルをつけたクラス内で書くこと。Redundant conformance of 'A***' to protocol 'B***'
A***のB***プロトコルの余分な準拠
【確認ver】Swift 3.0.2【語】redundant 余剰で//Swift 3.0.2
class MyTableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate { //エラー
}
UITableViewControllerがUITableViewDelegateとUITableViewDataSourceを持っているので余分に付けなくてよい。Immutable property requirement must be declared as 'var' with a '{ get }' specifier
変更出来ないプロパティはvarと{ get }を使って宣言される必要がある
【確認ver】Swift 3.0.2//Swift 3.0.2
protocol protocolA {
let a: Int
}
プロトコルでlet宣言するときはvar a: Int { get }とするとOK。実装側でletにする。Default argument not permitted in a protocol method
プロトコルで宣言されたメソッドではデフォルト値は認められません
【確認ver】Swift 3.0.2//Swift 3.0.2
protocol A {
func funcA(a: Int = 0) //エラー
}
Global scope グローバルスコープ
classやstructの定義範囲の外のような何にも囲まれてないのところをglobal scopeという(「場所」というより「アクセス設定」の概念のほうが定義に近いかもしれない)Swiftのエラーメッセージではtop lebelと表現されることもある
global scopeで宣言されている変数/定数はglobal変数/global定数
global scopeで宣言されているfunctionはglobal function
Global 'var' declaration requires an initializer expression or getter/setter specifier
グローバルのvar変数宣言は初期化かgetter/setterが必要
【確認ver】Swift 4.0//4.0
//グローバルで
var a: Int //エラー
Global 'let' declaration requires an initializer expression
グローバルの'let定数宣言は初期化が必要
【確認ver】Swift 4.0//4.0
//グローバルで
let b: Int //エラー
Expressions are not allowed at the top level
トップレベルでは許可されていない式です
【確認ver】Swift 4.0関数やメソッド内などでしか実行できない命令を関数やメソッドの外で行った時
//4.0
//トップレベルで
self.init() //エラー
abs(1) //エラー
//4.0
//トップレベルで
SomeClass {} //エラー
classキーワード忘れ//4.0
//トップレベルで
someFunc() { //エラー
}
funcキーワード忘れclass methods may only be declared on a type
static methods may only be declared on a type
クラスメソッドは型の中でのみ定義できます
スタティックメソッドは型の中でのみ定義できます
【確認ver】Swift 3.0.2//Swift 3.0.2
//トップレベルで
class func abc() { //エラー
}
static func abc() { //エラー
}
Operator 演算子
'***' is not a prefix(postfix) unary operator
***は前置(後置)単項演算子ではありません
【確認ver】Swift 4.0【語】unary operator 単項演算子//4.0
var abc = 0
abc+
'***' is not a binary operator
'***'は2項演算子ではありません
【確認ver】Swift 4.0//4.0
var a: Int = 0
var b: Int = 0
b = a ++ a //エラー
似ている名前の2項演算子と間違えてしまった場合Unary operator 'A***' cannot be applied to an operand of type 'B***'
単項演算子AはB型に適用出来ません
【確認ver】Swift 4.0Bにはややこしいものが入ることがある
++や--は廃止になったので従来のC言語の使い方をすると出る。
//4.0
var a: Int = 0
++a //エラー
++は廃止//4.0
var nums: [Int] = [1,2]
nums++ //エラー
配列をインクリメントしようとしているがそもそも++は廃止Binary operator 'A***' cannot be applied to operands of type 'B***' and 'C***'
2項演算子AはB型とC型の演算に適用出来ません
【確認ver】Swift 4.0//4.0
var abc: String
var def = abc + 0 //エラー
Stringと0との足し算をしようとしている//4.0
var abc8: Int8 = 0
var abc16: Int16 = 0
var abc = abc8 | abc16
Int8とInt16のビット演算は不可。Int16(abc8)にすると受け付ける。//4.0
var abc: Character = "a"
var abc2: String = "abc"
var abc3 = abc + abc2 //エラー
StringとCharacterを+させようとしたとき//4.0
let range = 0...10
if 5 ~= range { //エラー
}
~=演算子の左右が逆//Swift3.0.1
let aTuple = (1.0,2.0,3.0)
let bTuple = (2,3,4)
if aTuple == bTuple { //エラー
}
タプルの比較は中身の型が違うと出来ない中身の型が同じ組み合わせは昔はエラーが出たがSwift3.0では出ない。
Binary operator 'A***' cannot be applied to two 'B***' operands
2項演算子Aは2つのB型の演算に適用出来ません
【確認ver】Swift 3.0.12つを比較する==と===は、クラス同士か構造体同士かで挙動が逆になるので注意。
//Swift 3.0.1
var a: String = "ABC"
var b: String = "ABC"
if a === b { //エラー
}
var c: String? = "ABC"
var d: String? = "ABC"
if c === d { //エラー
}
===はクラス同士なら、同じインスタンスかどうか判別する機能を持つが、Stringは構造体だからなのかエラーになる。==にすればエラーにならない。構造体のオプショナル同士でも===でエラー。==にすればエラーにならない。
//Swift 3.0.1
class ABC {
}
let a = ABC()
let b = ABC()
if a == b { //エラー
}
let c: ABC? = ABC()
let d: ABC? = ABC()
if c == d { //エラー
}
クラス同士の場合は==でエラーになり、===でエラーにならない。クラスのオプショナル同士の場合も==でエラーになり、===でエラーにならない。
おまけ
//Swift 3.0.1
let e: ABC? = ABC()
if e == nil { //OK
}
if e === nil { //OK
}
クラスのオプショナル型とnilの比較は==でも===でも可能。//Swift 3.0.1
let aDouble: Double = 2.0
let bDouble: Double = 3.0
let c: CGFloat = a + b //エラー Double同士で足し算できないと言われる
let d: CGFloat = CGFloat(a + b) //これはOK
let e: CGFloat = CGFloat(a) + CGFloat(b) //これはOK
左辺で指定している型が右辺の演算に口出ししてくる//Swift 3.0.2
enum RST {
case rr(Int)
case ss(String)
case tt(Double)
}
let r = RST.rr(1)
let s = RST.ss("こんにちは")
if r == s { //エラー
}
enumのこのタイプの場合は==比較でエラーになる。enumの定義に比較のメソッドを書く対応方法がある。Left side of mutating operator isn't mutable: '***' is a 'let' constant
値を変更する演算子の左側が変更出来る変数ではない。***はletで定義された定数です
【確認ver】Swift 4.0//4.0
let abc = "abc"
abc += " def" //エラー
letで宣言した定数を操作しようとした。Unary operator cannot be separated from its operand
単行演算子はオペランド(演算を適用したいもの)を離すことは出来ません
【確認ver】Swift 4.0【語】Unary operator 単項演算子//4.0
var a: Int = 0
var b = - a //エラー
-や&などの単項演算子とオペランドとの間にスペースがある。スペースはいらない。&や|や*が変なところに入っている
Expected member name following '.'
.の後ろにメンバ名が期待される
【確認ver】Swift 4.0.の後ろが書かれていない
//4.0
//定義
enum BloodType: String {
case A
case B
case AB
case O
}
//使用
BloodType. //エラー AかBかOかABが必要
Expected expression after operator
演算子の後ろに何か式が期待される
【確認ver】Swift 4.0//4.0
print("There are " + ) //エラー
//4.0.2
let a = 1 + //エラー
Operator should no longer be declared with body
(自作)演算子の宣言では{}のカッコがいらなくなりました
【確認ver】Swift 4.0//4.0
prefix operator √ {} //エラー
prefix func √(x:Double)->Double {
return sqrt(x)
}
'***' is considered to be an identifier, not an operator
***は変数などの名前(identifier)には使用できるが、演算子の名前には使用できない
【確認ver】Swift 4.0//4.0
infix operator あんど //エラー
infix operator andand //エラー
Operator must be declared as 'prefix', 'postfix', or 'infix'
演算子はprefixかpostfixかinfixを付けて宣言しないといけない
【確認ver】Swift 4.0
operator +- //エラー
Operator implementation without matching operator declaration
演算子の実装が宣言と合わない
【確認ver】Swift 4.0宣言を忘れているとき。
宣言と実装で〜fixの不一致。preとpostなど。
//4.0
//宣言がない prefix operator √
prefix func √(x:Double)->Double { //エラー
return sqrt(x)
}
宣言がない//4.0
infix operator √
prefix func √(x:Double)->Double { //エラー
return sqrt(x)
}
infixとprefixの不一致'infix' modifier is not required or allowed on func declarations
infixはfunc宣言部にいらない
【確認ver】Swift 4.0//4.0
infix operator ++++
infix func ++++(l: Double, r: Double) -> Double { //エラー
return sqrt(l + r)
}
'%' is unavailable: Use truncatingRemainder instead
%は使えません。代わりにtruncatingRemainderを使ってください
【確認ver】Swift 3.0.1//Swift 3.0.1
let a = 4.0 % 3.0 //エラー
let b = 4.0.truncatingRemainder(dividingBy: 3.0) //OK
%の代わりになるのはtruncatingRemainder(dividingBy:)他にremainder(dividingBy:)というのもある。
数値の表現/演算
Doubleの0.0で割っても実行時エラーにならない。また0.0に正負があって、下の例ではマイナス無限大が実行結果になる。//3.1
let a = -0.0
let b = 5.0
b/a //結果は-inf
16進数表記の指数部開始の文字はpで指数部数字は10進(0〜9)で表記、小数点移動作用は2進数状態に対して行われる//3.1
let a = 0x1.ap-4 //10進の0.1とだいたい同じ値を16進で表記
上の例は16進の1.aに指数部p-4が付いたもの。指数部の数字は10進で表記する。つまりp9はOKでpaはNG。今回のp-4はOK。
指数部の数字による小数点移動は2進状態に対して行われる。つまり上の例は、1.1010(2進)上で4つ移動して、0.0001101(2進)となる。これを16進にすると0.1a(16進)。これを10進に直すと、1/16 + 10/256 = 0.1015625。個人的には、この小数点移動操作が2進なのは盲点だった。16進表記のままで4桁の小数点移動操作を行うと0.0001a(16進)となり、だいぶ小さい値になってしまう。
Expected a digit after integer literal prefix
整数表現で始まったものの後に想定されるものがない、想定されないものがある
【確認ver】Swift 3.0.2下のリストを参照
Hexadecimal floating point literal must end with an exponent
16進表現の少数は指数で終わらないといけない
【確認ver】Swift 4.0【語】Hexadecimal 16進法の exponent 指数少数表現16進ではe4などで終わると指数の意味で使っているかどうか解釈に迷うことになるので、指数表現に用いる文字はpを使います。少数表現16進は指数表現をつけることが必須です。
//4.0
var a = 0x123456 //エラーなし
var b = 0x123456.789 //エラー p4などがない
var c = 0x1.2e10 //エラー eではなくてpを使う
var d = 1.2p10 //エラー Consecutive statements on a line must be separated by ';'
10進表現にはeを使うが、16進表現(0x〜)ではeが数値を表すので指数部の表現としてpを使う10進表現にpを使った場合はpから別の文と解釈される
'A***' is not a valid floating point literal; it must be written 'B***'
A***は正しい少数表現ではありません。B***と書かれるべきです。
【確認ver】Swift 4.0//4.0
var a: Double = .45 //エラー
0.45の場合は0が必要Value of type 'Int' has no member '***'
Intには***というメンバはありません
【確認ver】Swift 4.0//4.0
var a = 1._0 //エラー
var b = 0x1._0p1 //エラー
var c = 1.e1 //エラー
var d = 0x1.p1 //エラー
小数点直後の_は使えない小数点直後の指数表現はだめ
//Swift 3.0.2
//正しい例
var rightNumber10i = 1234
var rightNumber10f = 1234.5678
var rightNumber10e = 1234.5678e10
var rightNumber16i = 0x1234
var rightNumber16e = 0x1234.5678p10
var rightNumber2i = 0b1010
var rightNumber8i = 0o7070
//間違った例
var wrong_int_10_a = 45c2d34 //エラー Expected a digit after integer literal prefix
//cとdは扱えない。10進数表記なのでprefixはないけど他の進数とメッセージが共通。
var wrong_int_2_a = 0b4 //エラー Expected a digit after integer literal prefix
//扱える数値の範囲を超えている。2進数なので4は想定していない。
var wrong_int_2_b = 0b0123 //エラー Consecutive statements on a line must be separated by ';'
//2進数で1までは正常に解釈できる。なので(;で区切ってください)が出る。
var wrong_int_16_a = 0X11 //エラー Expected a digit after integer literal prefix
//xの大文字はダメ
var wrong_int_16_b = 0x1234p //エラー Expected a digit in floating point exponenent
//pの後に指数の値が必要
var wrong_int_16_c = 0x123paa //エラー
//Consecutive statements on a line must be separated by ';'
//Expected a digit in floating point exponent
//16進数の少数の指数は10進で表記する
var wrong_float_10_a = .1234 //エラー '.1234' is not a valid floating point literal; it must be written '0.1234'
//0.1234ならOK
var wrong_float_10_b = 1234. //エラー Expected member name following '.'
//.を書いたらその後ろも書かないといけない
var wrong_float_10_c = 1234.5678p10 //エラー Consecutive statements on a line must be separated by ';'
//10進数の少数の場合、指数はeで表す。8までは正常に解釈できる。なので(;で区切ってください)が出る。
var wrong_float_16_a = 0x123456.789 //エラー Hexadecimal floating point literal must end with an exponent
//p4などの指数表記をつけないといけない
var wrong_float_16_b = 0x123.456e10 //エラー Hexadecimal floating point literal must end with an exponent
//16進数の少数の指数はeではなくpを使う
var wrong_float_16_c = 0x.123p4 //エラー
//Consecutive statements on a line must be separated by ';'
//Expected a digit after integer literal prefix
//Expected identifier after '.' expression
//0x0.123p4ならOK
var wrong_float_16_d = 0x123.p4 //エラー Value of type 'Int' has no member 'p1'
//.を書いたら後ろに数値が必要。.の後ろの数値がないなら0x123p4でよい
var wrong_float_2_8_a = 0b10.10 //エラー Expected named member of numeric literal
var wrong_float_2_8_b = 0o40.40 //エラー Expected named member of numeric literal
//2進数と8進数では少数は表記できない
var wrong_float_2_8_c = 0b1e1//エラー Consecutive statements on a line must be separated by ';'
var wrong_float_2_8_d = 0o1p1//エラー Consecutive statements on a line must be separated by ';'
//2進数と8進数では指数表現できない
var wrong_float_2_8_e = 0b10.1e10 //エラー
//Consecutive statements on a line must be separated by ';'
//Expected named member of numeric literal
//0bの2進数表現と0oの8進数表現は少数を扱えない
var wrong_float_2_8_f = 0b12.5p10 //エラー
//Expected member name following '.'
//Expected a digit after integer literal prefix
//0oの8進数表現は少数に使えない
ポインタ系 inout系
Passing value of type '***' to an inout parameter requires explicit '&'
&を必要とするinoutパラメータに***型を渡しています
【確認ver】Swift 4.0//4.0
func thePFunc(arg: inout Int){
}
var a = 0
thePFunc(arg: a) //エラー
定義ではinoutで定義されているので呼び出し部では&aとしないといけないCannot pass immutable value as inout argument: '***' is a 'let' constant
inout引数に変更出来ない値を渡すことは出来ません。***はlet定数です。
//4.0
func thePFunc(arg: inout Int){
}
let b = 0
thePFunc(arg: b) //エラー
//4.0
postfix operator ++
postfix func ++(arg: inout Int) -> Int {
let returnArg = arg
arg += 1
return returnArg
}
let b = 0
b++ //エラー
bに1足そうとしているが、bがletなのでエラーCannot pass immutable value of type '***' as inout argument
inout引数に***型の変更出来ない値を渡すことは出来ません
【確認ver】Swift 4.0【途方にくれる度】★★★★ちょっと原因がわかりにくいエラー
//4.0
func ioFunc(a: inout Int){
}
var a: Int! = 0
ioFunc(a: &a) //エラー
aが強制アンラップのオプショナルで宣言されてる。ioFunc(a: &a!)ならOK'inout' before a parameter name is not allowed, place it before the parameter type instead
パラメータ名の前のinoutは許されていません。代わりに型の前に置いてください。
【確認ver】Swift 3.1//3.1
func abc(inout a: Int) { //エラー
a = 0
}
Variable has type 'inout ***' which includes nested inout parameters
'&' can only appear immediately in a call argument list
変数はinout ***型を持っています。それは入れ子の(?)inoutパラメータを持っています。
amp;はメソッドへの引数でしか使えない
【確認ver】Swift 4.0nestedの意味がよくわからない。
//4.0
var a = 0
let b = &a //エラー
Tuple タプル
Value of tuple type '(A1,A2***)' has no member 'B***'
(A1,A2...)というタプルにはBという名前のメンバーはありません
Bが要素番号になることもある【確認ver】Swift 4.0
//4.0
let abc: (a: String, b: Int) = ("あ", 1)
print(abc.c) //エラー
cはない//4.0
let abc = ("Hello","world")
print(abc.3) //エラー
abcは0と1しか持ってないので3にアクセスしようしてエラーDefault argument not permitted in a tuple type
デフォルト引数はタプルの型に許されません
【確認ver】Swift 4.0//4.0
let abc: (a: String = "あ", b: Int = 1) //エラー
Use of unresolved identifier '***'
***は解決出来ません。
【確認ver】Swift 4.0//4.0
func abc() -> (Int, String) {
return (1, "あ")
}
let (a: Int , b: String) = abc()
print(a)
print(b)
let (a: Int , b: String)のところはlet (ラベル名: 変数名 , ラベル名: 変数名)と解釈される
Tuple pattern element label 'A***' must be 'B***'
タプルのラベルAはBと書かれるべき
【確認ver】Swift 4.0//4.0
var (aa: a , bb: b): (a: Int, b: String) //エラー
コンパイラの解釈はvar (ラベル名: 変数名 , ラベル名: 変数名): (ラベル名: 型, ラベル名: 型)
なのでラベル名が重複している
Tuple type '(ラベル名: 型, ラベル名: 型)' is not convertible to tuple '(ラベル名A: _, ラベル名B: _)'
タプルのラベルは、ラベルAとラベルBと書かれるべき
【確認ver】Swift 4.0//4.0
func abc() -> (a: Int, b: String) {
return (1, "あ")
}
var (aa: a , bb: b) = abc()
関数の戻り値でラベルを定義してあるので、それに従うこと。if
Use of '=' in a boolean context. did you mean '=='?
論理値が求められる箇所で=を使っています。やりたいことは==を使ったら出来ませんか?
【確認ver】Swift 4.0//4.0
var abc: Bool
var abc2 = true
if (abc = abc2) {
}
単純な代入では判定が出来ない。C言語のように値を返すことはない。abc == abc2でOK。Expected '{' after 'if' condition
ifの後の{が期待される
【確認ver】Swift 4.0//4.0
let i = 0
if i == 0 print("abc")
C言語ではOKな手法だが、Swiftでは実行文を{}で囲む必要がありOptional type '***' cannot be used as a boolean; test for '!= nil' instead
オプショナルタイプの'***'はブーリアンとして使えません。!= nilを代わりに試して下さい
【確認ver】Swift 3.0.1//Swift 3.0.1
var abc :Bool? = false
if abc { //エラー
}
値があるかnilかの判定はabc != nilを使うvar abc :Bool? = false
if abc as? Bool { //エラー
}
as?の結果はオプショナルなので上の例と同じちなみにisにしてもエラーになる
値があるかnilかの判定は!= nilを使う
let a: Bool? = true
let b: Bool? = true
if let c = a && b { //エラー
}
aとbはオプショナルなので&&が出来無い。if let c = a, d = b where c && d {}
等がよいか。
'is' test is always true
is判定は常にtrueとなります
【確認ver】Swift 4.0//4.0
var a = 5
if a is Int { //警告
}
常にtureなら判定の必要がないので警告ということなのでしょう。Comparing non-optional value of type 'Any' to nil always returns true/false
Anyという非オプショナルとnilの比較は常にtrue/false
【確認ver】Swift 3.1true/falseのどっちが表示されるかは==か!=かによる
//3.1
var intOpt: Int? = nil
var anyInt: Any = intOpt
if anyInt == nil { //ワーニング always false
}
if let
2つをif letしたいときは,で区切る。普通の論理(ture or false)を加えたい時はwhereで続ける。let a: Bool? = true
let b: Bool? = true
if let c = a, d = b where c == d {
}
Initializer for conditional binding must have Optional type,not '***'
条件バインディングへの初期化(に与えるもの)はオプショナル型である必要があります。***はだめです。
【確認ver】Swift 3.1//3.1
var abc: String = "aaa"
if let abc2 = abc { //エラー
}
abcは?付きではないのでこの判定をする必要がない。//3.1
let a: Int? = 5
if let aa = a! { //エラー
}
すでに!でアンラップしてあるものをアンラップしようとした//3.1
var anyDeGozaru: Any = UIImage(named: "aaa")
if let any_uw = anyDeGozaru { //エラー
}
オプショナル型をAnyに入れた。Variable binding in a condition requires an initializer
条件部で使われる値は初期化される必要がある
【確認ver】Swift 4.0//4.0
if let abc {
}
=とその後がない//4.0
if let abc2 == abc {
}
=が多い//4.0
var abc :Bool? = false
if let abc as? Bool {
}
=がないguard
使い方guard 条件 else {}
Expected 'else' after 'guard' condition
guardの条件部の後にelseが必要です
【確認ver】Swift 4.0//4.0
guard condition { //エラー elseなし
return
}
'guard' body may not fall through, consider using 'return' or 'throw' to exit the scope
guardは下に抜けるべきではありません。抜けるためにreturnかthrowを検討してください。
【確認ver】Swift 4.0returnやthrowが必要。ちなみにbreakを使うとエラー。
//4.0
func testFunc(condition: Bool) {
guard condition else {
} //エラー
}
'break' is only allowed inside a loop, if, do, or switch
breakは次の場所で許されます。ループ内、if、do、switch
【確認ver】Swift 4.0//4.0
func testFunc(condition: Bool) {
guard condition else {
break //エラー
}
}
for
Cannot assign to value: '***' is a 'let' constant
代入できません。***はletで宣言された定数です。
【確認ver】Swift 4.0カウンターは(我々が操作出来ないという意味で)定数という扱いらしい
//4.0
for i in 1...5 {
i = 10 //エラー
}
//4.0
var counter = 0
for counter in 1...5 { //ここではエラーが出ない
counter = 10 //エラー
}
counterをvarで宣言してもforの条件設定部分ではエラーにならない。エラーは代入部で出る。別のcounter定数が生成されているのかもしれない。Use of unresolved identifier '***'
正体不明である'***'を使用している
【確認ver】Swift 4.0.2//4.0.2
for counter in 1..5 { //エラー
}
'..'ではなく'..<'が正しい//4.0.2
let a = 5 &/ 3 //エラー
let b = 5 &% 3 //エラー
これらの演算子は廃止になった。//4.0.2
for counter in 1..=5 { //エラー Expected expression after operatorも出る
}
'..='ではなく'...'が正しいType '***' does not conform to protocol 'Sequence'
***は'Sequence'プロトコルに設定されていません
【確認ver】Swift 4.0.2//4.0.2
let today = NSDate()
for i in today { //エラー
}
において、inの後ろに持ってくるにはふさわしくないものの時//4.0.2
let interval: ClosedInterval = 0...10
for i in interval { //エラー
}
ClosedIntervalやHalfOpenIntervalはだめExpexted ',' separator
Expected pattern
Expected Sequence Type expression for for-each loop
Expected 'in' after for-each pattern
','分割子が想定される
パターンが想定される
for-eachループの順番式が想定される
for-eachパターンの後にinが想定される
【確認ver】Swift 4.0.2forの条件が i in 0..<10の形式のときは()をつけてはいけない
//4.0.2
for (i in 0..<10) { //エラー
}
C-style for statement has been removed in Swift 3
Cスタイルのfor文はSwift 3で取り除かれました
【確認ver】Swift 4.0.2//4.0.2
for (var i=0;i<10;i++) { //エラー
}
'let' pattern cannot appear nested in an already immutable context
文脈から判断して定数になるところに、letのパターンは現れてはいけない
【確認ver】Swift 4.0.2 【語】nest 重ね合わせる 【文法】S appear nestedはSVC?//4.0.2
for let i in 0...10 { //エラー
}
letはいらない//Swift 3.0
let opInt: [Int?] = [2, 5, nil, 6]
for let a in opInt { //エラー アンラップしようとしているが...
}
勝手に文法を作ってはだめletを省いたらコンパイルエラーはなくなる
switch
説明に使うenumenum BloodType {
case A
case B
case O
case AB
}
'switch' statement body must have at least one 'case' or 'default' block; do you want to add a default case?
switchは最低ひとつのcaseかdefaultが必要。defaultをつけたいか?
【確認ver】Swift 4.0.2/4.0.2
let a = 1
switch a {
}
All statements inside a switch must be covered by a 'case' or 'default'
switch中のすべての文はcaseかdefaultの中に書かないといけない
【確認ver】Swift 4.0.2//4.0.2
let a = 1
switch a {
var b = 0 //エラー
}
Expected ':' after 'case'
caseの後には:(コロン)が必要
【確認ver】Swift 4.0.2//4.0.2
switch bloodType {
case A //エラー
case B //エラー
case O //エラー
case AB //エラー
}
'case' label in a 'switch' should have at least one executable statement
switch中のcaseブロックの中は最低1つの実行文が必要
'default' label in a 'switch' should have at least one executable statement
switch中のdefaultブロックの中は最低1つの実行文が必要
【確認ver】Swift 4.0.2
var a = 5
switch a {
case 0: //エラー
default:
a += 5
}
switch a {
default: //エラー
}
breakやfallthroughをつけるとエラーが消える複数の"場合"で同じ処理をするには"場合"を,(カンマ)で区切って記述する。
'fallthrough' without a following 'case' or 'default' block
fallthroughの後にcaseもdefaultもない
【確認ver】Swift 4.0.2fallthroughの後にはcaseブロックかdefaultブロックをつけること
//4.0.2
let a = 1
switch a {
default: fallthrough //エラー
}
この場合はすでにdefaultはあるのでdefaultを付けるという提案は間違いだが、エラーメッセージの文章はまあこれで別にいいかなという気はする。Additional 'case' blocks cannot appear after the 'default' block of a 'switch'
switchの中でdefaultブロックの後にcaseを書くことは出来ません
【確認ver】Swift 4.0.2//4.0.2
let a = 5
switch a {
default:
fallthrough
case 0: //エラー
//処理
case 1:
//処理
case 2:
//処理
}
これは出来るようにしてほしいが、上から順に条件にあてはまるかどうか確かめて、どこにもあてはまらなかったら最後にdefaultを実行という処理をコンパイルしやすくするために禁止されているのだろうか。Expected ':' after 'default'
defaultの後に:が必要
defaultでも:が必要です。【確認ver】Swift 4.0.2
//4.0.2
switch a {
default //エラー
}
Expected pattern
Expected ':' after 'case'
想定されるパターン(が求められる)
caseの後に:が想定される
【確認ver】Swift 3.0//Swift 3.0
switch a {
case default: //エラー
}
defaultの前にcaseはいらないSwitch must be exhaustive
Switchによる場合分けにはもれがないことが必要
【確認ver】Swift 4.0.2【語】exhaustive あますところのない場合分けにもれがあるときに出る
//4.0.2
switch bloodType {
case .A:
print("A型です")
case .B:
print("B型です")
} //エラー OとABがない
//4.0.2
//これはOK
var a = false
//処理
switch a {
case true:
print("true")
case false:
print("false")
}
これはSwift1.2ではダメだったが、Swift2.1ではOKになった模様。'***' must be bound in every pattern
***は全てのパターンを網羅しないといけない
【確認ver】Swift 4.0.2//4.0.2
var a = (1, 2)
switch a {
case (1, let b), (2, 2): //エラー
print(b)
default:
break
}
(2, 2)だったときにbが確定しないのでエラー'fallthrough' cannot transfer control to a case label that declares variables
下に変数(定数も)宣言されたcaseがあるときはfallthroughで下に行けない
【確認ver】Swift 4.0.2//4.0.2
var a = (1, 2)
switch a {
case (1, 1):
fallthrough
case (1, let b):
print(b)
default:
break
}
(1, 1)から下に抜けるとbが確定しない。その他の制御文
'do-while' statement is not allowed; use 'repeat-while' instead
do-while文は許可されません。代わりにrepeat-whileを使ってください。
【確認ver】Swift 4.0.2 【語】allow 許可する instead 代わりにSwiftの仕様にdo-try-catchが追加されたときにdo-whileのdoは使用禁止になりました。
//4.0.2
do { //エラー
} while *****
//正しい例
repeat { //エラー出ず
} while *****
アクセス修飾子
Function/Method cannot be declared public because its parameter/result uses an internal/private type
関数/メソッドはpublicで宣言出来ません。引数/結果(戻り値)にinternal/privateの型を使っているからです
Function/Method must be declared private because its parameter/result uses a private type
関数/メソッドはprivateで宣言されなければいけない。引数/戻り値がprivateなものを使っているから
【確認ver】Swift 2.0cannot be declared publicとmust be declared privateは同じようなものだが文面に違いがあるのは、"publicをつけてはいけない"と言いたいのか、"privateをつけないといけない"と言いたいのかの違い。
アクセス修飾子がなにも付いていないものはinternal(モジュール内のみからアクセス許可)
class AAA {
}
public func useAAA() -> AAA {//Function cannot be declared public
return AAA()
}
internalなAAAをpublicなfuncで戻り値で使用しようとしたclass AAA {
}
public func useAAA(aaa: AAA) {//Function cannot be declared public
}
internalなAAAをpublicなfuncで引数で使用しようとしたprivate class PrivateABC {
}
func theFunc(a: PrivateABC, b: PrivateABC) -> PrivateABC{//Function must be declared private
//処理
return PrivateABC()
}
class InternalABC {
func theFunc(a: PrivateABC, b: PrivateABC) -> PrivateABC{//Function must be declared private
//処理
return PrivateABC()
}
}
関数/メソッドの引数/戻り値の型がprivateでその関数/メソッドがinternalのときProperty cannot be declared public because its type uses an internal type
プロパティはpublicで宣言出来ません。privateなものを使っているから
Property must be declared fileprivate because its type uses a private type
プロパティはfileprivateで宣言されなければいけない。privateなものを使っているから
【確認ver】Swift 4.0.2これも文面に違いがあるのは、"publicをつけてはいけない"と言いたいのか、"privateをつけないといけない"と言いたいのかの違い。
//4.0.2
private class PrivateABC {
}
class InternalABC {
//Property must be declared fileprivate because its type uses a private type
var a: PrivateABC = PrivateABC() //エラー
}
public class PublicABC {
//Property cannot be declared public because its type uses an internal type
public var a: InternalABC = InternalABC() //エラー
}
Expected 'get', 'set', 'willSet', or 'didSet' keyword to start an accessor definition
アクセサ定義の開始には'get', 'set', 'willSet', 'didSet'キーワードが要求されます
【確認ver】Swift 4.0.2//4.0.2
class SomeInternalClass {
var a: Int {
get {
return self.a
}
private set { //エラー
self.a = newValue
}
}
}
privateの位置が違う。private(set) var a: Int {ならエラーが出ない。
Attribute 'private' can only be used in a non-local scope
privateはローカルなところでのみ使える
【確認ver】Swift 4.0.2//4.0.2
class SomeInternalClass {
var a: Int {
private set { //エラー
self.a = newValue
}
get {
return self.a
}
}
}
privateの位置が違う。private(set) var a: Int {ならエラーが出ない。
Expected 'set' as subject of 'public/internal/private' modifier
'public/internal/private'がつけられたsetが期待される
【確認ver】Swift 4.0.2//4.0.2
public class SomePublicClass {
public var a: Int = 0 //エラーなし
public public(set) var b: Int = 0 //エラーなし
public internal(set) var c: Int = 0 //エラーなし
public private(set) var d: Int = 0 //エラーなし
public(get) var e: Int = 0 //エラーあり
internal(get) var f: Int = 0 //エラーあり
private(get) var g: Int = 0 //エラーあり
public(get) public(set) var h: Int = 0 //エラーあり
public(get) private(set) var i: Int = 0 //エラーあり
private(get) private(set) var j: Int = 0 //エラーあり
}
Swiftの構文として、set側にはprivate(set)などが用意されているが、get側にはpublic(get)のようなものはない(Swift1.2現在)よってこれらのエラーはpublic(get)に対して、それはsetの間違いなのではないかと指摘するエラーメッセージと思われる。getにもsetにもprivateを設定しているものは、それでもprivateのsetを要求するメッセージが出る。これも上の理由によりprivate(get)が書かれたことが原因で出てきたものと推測。
Internal property cannot have a public setter
Internalのプロパティはpublicのセッターを持てない
【確認ver】Swift 4.0.2//4.0.2
public class SomePublicClass {
public(get) public(set) var h: Int = 0 //エラー
}
public(get)がだめな表記なので有効にならず、internalと判断された。nilの扱い
'nil' requires a contextual type
nilは文脈上の型が必要です
【確認ver】Swift 4.0//Swift 4.0
var abcd = nil
Int?やString?などの型を決めないとだめ。Reference to member 'none' cannot be resolved without a contextual type
noneメンバへの参照が解釈できません。型決定の情報がないので。
【確認ver】Swift 3.1//Swift 3.1
let a = .none
Int?やString?などの型を決めないとだめ。Nil is incompatible with return type '***'
***型を返すところで、nilは互換性がありません。
【確認ver】Swift 4.0.2関数の戻り値に?付きでないものが宣言されているのにnilを返そうとした
//4.0.2
func abc () -> String {
return nil //エラー
}
Nil cannot inititialize specified type '***'
nilは***を初期化出来ません
【確認ver】Swift 4.0//4.0
var abc: String = nil //エラー
nilを入れるならString?の型にしないといけない//4.0
var abcde: Any = nil //エラー
var intOpt: Int? = nil
var anyInt: Any = intOpt //警告が出るがエラーではない。
Any型をnilで初期化出来ない。ただし、オプショナル型をAnyに代入するのはエラーではない。Optional オプショナル
Cannot force unwrap value of non-optional type '***'
非オプショナルの***型は強制アンラップ出来ません
【確認ver】Swift 4.0.2//4.0.2
let c: Bool = true
var d = c! //エラー
Boolがオプショナル型ではないValue of optional type '***?' not unwrapped; did you mean to use '!' or '?'?
オプショナル型の'***?'はアンラップされていません。やりたいことは、!か?を使用したら出来そうなのでは?
【確認ver】Swift 4.0.2オプショナル型やアンラップの意味がわからない場合は、オプショナル型について調べる(少し時間がかかります)
//4.0.2
var aStr = "1980"
var aInt = Int(aStr) + 23 //エラー
Int(aStr)はオプショナル型を返す//4.0.2
let array: Array? = ["a","b"]
for element in array { //エラー
}
まあ、?を使ってarray?にしてもエラーは出る。!がよろしい。//4.0.2
var abc: Bool
var abc2: Bool? = true
if abc = abc2 {
}
let忘れCannot use optional chaining on non-optional value of type '***'
***型の非オプショナル変数にオプショナルチェインを使うことは出来ません
【確認ver】Swift 4.0.2//4.0.2
let a: Bool = true
var b = a? //エラー
Optional chain has no effect, expression already produces '***?'
オプショナルチェインは意味がありません。すでに***?型になっています。
【確認ver】Swift 4.0.2//4.0.2
let c: Bool? = true
var d = c? //エラー
A*** not found in type 'B***?'
B***?型にA***はありません
【確認ver】Swift 4.0.2オプショナル型をアンラップしないままで何かしたときなど
//4.0.2
enum TestEnumUnion {
case testUnionStr(String)
case testUnionInt(Int, Int)
}
let a = TestEnumUnion.testUnionInt(0, 0)
let aa = ["aa" : a]
if case .testUnionInt(0, 0) = aa["aa"] { //エラー
}
if case .testUnionInt(0, 0)? = aa["aa"]とするとOKImplicitly unwrapped optionals are only allowed at top level and as function results
暗黙アンラップオプショナルはトップレベルか関数の戻り値のみ許される
【確認ver】Swift 3.0//Swift 3.0
let arrayTest: [Int!] = [1, 2, 3, 4, 5] //エラー
配列の定義や、タプルの定義ではInt!などの暗黙アンラップオプショナルは使えない。Expression implicitly coerced from '***?' to Any
***?型が強制的にAnyに変換される
【確認ver】Swift 3.0.2【語】coerce 無理やりさせる//Swift 3.0.2
var any: Any = UIImage(named: "aaa") //エラー
UIImage(named:)の戻り値はオプショナル。参照カウンタ
weakとunownedはともに対象を保持しない印。weak変数はオプショナル型に使われ参照先が消えたらnilに設定される(nilを設定するのでオプショナル型にしか使えない)。unownd変数は非オプショナル型に使われ参照先が消えてもそのままで、消えた参照先にアクセスするとクラッシュする。保持の意味がわからないときの推薦検索用語はstrong weak ARC 参照カウンタ
'weak'('unowned') may only be applied to class and class-bound protocol types, not '***'
'weak'('unowned')はクラス(クラスバウンドプロトコル含む)にのみ使える。***はだめ。
【確認ver】Swift 4.0.2【途方にくれる度】★★★//Swift 4.0.2
unowned var a: UIView? //エラー
上の解説参照オプショナルはだめ
//Swift 4.0.2
unowned var b: Int = 0 //エラー
//Swift 4.0.2
weak var h: Int? = 0 //エラー
'weak' variable should have optional type '***?'
weakはオプショナル型に使われるべきで、それは'***?'
【確認ver】Swift 4.0.2//Swift 4.0.2
weak var b: UIView //エラー
上の解説参照'weak' must be a mutable variable , because it may change at runtime
weakは(letでなく)var宣言の変数であるべきで、理由は実行中に変更される可能性があるから
【確認ver】Swift 4.0.2//Swift 4.0.2
weak let a: UIView? //エラー
上の解説参照as
Downcast from '***?' to '***' only unwraps optionals; did you mean to use '!'
'***?'から'***'へのダウンキャストはただオプショナルをアンラップするだけです。やろうとしていることは'!'で出来ませんか?
【確認ver】Swift 2.0Swift2.0で発生した少し謎に思えるコンパイルエラー。
var a: Int? = nil
var aa = a as? Int//エラー
as?はキャストしようとしている目標の型のオプショナル型を返すが、この場合はInt?からInt?への変換となり、変換前と変換後が同じ。なので意味がないというコンパイラの指摘。後半の「やろうとしていることは'!'で出来ませんか?」はいくつかある解決策のうちのひとつという感じで参考程度に捉える。Int?からInt?へ変更しても何も不具合は出ないので赤警告にすることもないんじゃないかという気もする。as周りは微妙な変更が多いしまだ仕様が揺れている状態か。var a: Int? = nil
if let aa = a as? Int {//エラー
}
この上のif let系パターンで出る人が多いと思う。下のように変更すればいい。// 正しい例
var a: Int? = nil
//何かの処理
if let aa = a{
}
// aがInt?のとき
if a is Int { //エラー
}
オプショナル型(Int?)か非オプショナル型(Int)かの調査にisは使えない。is asは継承関係間の調査、変更に使われるのが基本。'AnyObject' is not convertible to '***'; did you mean to use 'as!' to force downcast?
AnyObject型を***型に変換出来ません。as!を使った強制ダウンキャストならやりたいことが出来るのでは?
【確認ver】Swift 4.0.2//4.0.2
class A {
}
var abc: AnyObject = A()
var abc2: A = abc //エラー
String, Character
Invalid use of '()' to call a value of non-function type 'Int'
Intという値(非関数)に対して、()の間違った使用
【確認ver】Swift 2.0let testArray = ["a", "b"]
let num = testArray.count()
countに()がいらないlet str = "ABCDE"
var num = str.count()
countに()がいらないちなみにSwift 2.0の段階ではstr.characters.countがおすすめ。
ただしObjective-Cとカウント結果を揃えたいならstr.utf16.countがよいかも。
'***' is unavailable: there is no universally good answer, see the documentation comment for discussion
***は使えません。ドキュメントの説明を見てください。(there is no universally good answerはコンパイラが提案のアドバイスを判断できない状態か?)
【確認ver】Swift 3.0//Swift 3.0
let str = "ABCDE"
var num = str.count //エラー
Swift 3.0の段階ではstr.characters.countがおすすめ。ただしObjective-Cとカウント結果を揃えたいならstr.utf16.countがよいかも。
エラー処理
Swift2.1の時点で、- tryは、エラー処理が必要、do catchで囲むなり、上(呼び出し元)に投げるなりしてください。
- try?は、エラー処理はいらない。エラーが起きてもtry?が書かれている処理の次の行を実行します。ただし、エラーが起きた時はtry?が書かれている処理の戻り値にnilを入れるのでオプショナルで宣言しておいてください。
- try!は、エラー処理はいらない。エラーが起きたら実行時エラーになります。
//4.0
enum MyError: Error {
case myError
}
func someThrowingFunction() throws -> Int {
if 条件 {
throw MyError.myError
}
return 0
}
func someFunction() {
someThrowingFunction() //Call can throw, but it is not marked...
try someThrowingFunction() //Errors thrown from here are not handled
try? someThrowingFunction() //OK
try! someThrowingFunction() //OK
let a: Int = try someThrowingFunction() //Errors thrown from here are not handled
let b: Int = try? someThrowingFunction() //Value of optional type '***?' not unwrapped...
let c: Int? = try? someThrowingFunction() //OK
let d: Int = try! someThrowingFunction() //OK
}
Expected throwing specifier; did you mean 'throws'?
throwする指定子が想定される
【確認ver】Swift 4.0//4.0
func abc() throw { //エラー
}
throwではなくthrows。Call can throw, but it is not marked with 'try' and the error is not handled
(メソッド)呼び出しは(エラーを)投げる可能性があります。しかしtryが書かれていないのでエラーを処理出来ません。
【確認ver】Swift 4.0.2上のサンプルを参照。
do catchで囲むなり、上(呼び出し元)に投げるなりする。
Errors thrown from here are not handled
ここで投げられたエラーは処理されません(処理を書いてください)
【確認ver】Swift 4.0.2 上のサンプルを参照。
do catchで囲むなり、上(呼び出し元)に投げるなりする。
Value of optional type '***??' not unwrapped; did you mean to use 'try!' or chain with '?'
オプショナル型の***??はアンラップされていません。やろうとしていることはtry!か?の連続で出来ませんか?
【確認ver】Swift 4.0.2 【危険度】★★★★★try?を使ったときに出る。上の例ではbへの代入のところで出ている。try?の文はエラーが発生しても次の文へ移る。エラーが出たときはbにはnilが入って、エラーの発生の有無を確認できるようにする。someThrowingFunction()はIntを返すメソッドだが、nilを許容するためにbはInt?としなければいけない。型指定がなければ自動でInt?となる。
またメッセージの最後のchain with '?'が謎であるが、次の様にメソッドがオプショナルを返すと定義されているときにtry?の戻り値の型がInt??となるが、それのことかなという気がする。
//4.0.2
enum MyError: Error {
case myError
}
func someThrowingFunctionOPT() throws -> Int? {
if 条件1 {
throw MyError.myError
} else if 条件2 {
return 0
}
return nil
}
func someFunction() {
let e: Int? = try? someThrowingFunctionOPT() //Value of optional type '***?' not unwrapped...
let f: Int?? = try? someThrowingFunctionOPT() //OK
}
Int?を投げるメソッドに対してtry?を使用しているので戻り値はInt??となる。また、このメソッドの危険度を5としたが、fix-itで出てきたtry!を選ぶとエラー発生のときに実行時エラーとなるので危険。
Expected expression in 'throw' statement
throw文の中に想定されるものがない
【確認ver】Swift 4.0//4.0
throw //エラー
throwの後にエラーを書かないといけない。Error is not handled because the enclosing function is not declared 'throws'
エラーは処理されません。その場所を囲っている関数がthrowsを書いてないからです。
【確認ver】Swift 4.0//4.0
enum MyError: Error {
case a
}
func testFunc() {
throw MyError.a //エラー
}
'try' must be placed on the initial value expression
tryは初期値式に置き換えなくてはいけません
【確認ver】Swift 4.0.3//4.0.3
do {
try let player = AVAudioPlayer(contentsOf: fileURL) //エラー
player.play()
} catch let error as NSError {
print("Failed to make the audio player \(error.localizedDescription)")
}
let player = try AVAudioPlayer(contentsOf: fileURL) にするとエラーは消える。Closure クロージャ
Unable to infer closure type in the current context
この書き方ではクロージャの型を推測することが出来ません
【確認ver】Swift 3.0.1//Swift 3.0.1
let closureA = { Void -> Void in //エラー
}
let closureB = { (Void) -> Void in //エラー
}
クロージャの定義で引数はVoidにできない。Unable to infer complex closure return type; add explicit type to disambiguate
複雑なクロージャの戻り値の型を推測することが出来ません。曖昧さをなくすためにはっきり型を書いてください。(意訳)
【確認ver】Swift 3.0.1【語】explicit はっきりとした disambiguate 違いを明らかにする//Swift 3.0.1
class A {
}
let a1 = { //エラー
let a = A()
return a
}()
let a2 = { () -> A in //OK
let a = A()
return a
}()
Instance member 'A***' cannot be used on type 'B***'
B型で、インスタンスメンバーAは使えません
【確認ver】Swift 3.0.1//Swift 3.0.1
class Test {
var a: Int = 0
let closureA = {
(num: Int) -> Void in
a = num + 3 //エラー
}
}
クロージャでなくメソッドにすれば使えるUse of unresolved identifier 'self'
selfが何かわかりません
【確認ver】Swift 3.0.1//Swift 3.0.1
class Test {
var a: Int = 0
let closureA = {
(num: Int) -> Void in //エラー
self.a = num + 3 //エラー
}
}
クロージャでなくメソッドにすればaにアクセス出来る。Reference to property '***' in closure requires explicit 'self.' to make capture semantics explicit
クロージャの中の***プロパティへの参照は明確なself.が必要。つかみ方を明確にするために
【確認ver】Swift 3.0.1//Swift 3.0.1
class Test {
var a: Int = 0
func funcA() {
let closureA = {
(num: Int) -> Void in
a = num + 3 //エラー
}
}
}
self.aにするとOK。Call to method '***' in closure requires explicit 'self.' to make capture semantics explicit
クロージャの中の***メソッドへの参照は明確なself.が必要。つかみ方を明確にするために
【確認ver】Swift 3.0.2//Swift 3.0.2
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
display()
}
(display()がselfのメソッドなら)self.display()にするとOK。Generics ジェネリクス
Cannot explicitly specialize a generic function
ジェネリックのファンクションは明確な形指定が出来ません
【確認ver】Swift 3.0.2//Swift 3.0.2
func abc<T>(a: T) -> T {
return a
}
let b = abc<Int>(a: 0) //エラー
Tの情報は引数で与えるか戻り値で与えるlet b = abc(a: 0)でOK。
Generic parameter '*' could not be inferred
ジェネリックパラーメータの*の型を推論出来ません
【確認ver】Swift 3.0.2//Swift 3.0.2
func abc<T>(a: IntegerLiteralType) -> T? {
return a as? T
}
let aaa = abc(a: 0) //エラー
戻り値から推論するタイプなので、代入するaaaが型情報を持たないと決定できない。その他の文法
Found an unexpected second identifier in typealias declaration; is there an accidental break?
Expected '=' in typealias declaration
typealiasの宣言で想定されない2つめの識別子が見つかりました。空白が入っていませんか?
typealias宣言では=が必要です
【確認ver】Swift 4.0.2//4.0.2
//(間違った例)
typealias Score UInt8
//4.0.2
//(正しい例)
typealias Score = UInt8
'continue' is only allowed inside a loop
continueはループの内部でのみ許可されます(使用出来ます)
'break' is only allowed inside a loop, if, do, or switch
breakはループかifかdoの内部、あるいはswitchの内部でのみ許可されます(使用出来ます)
Unlabeled 'break' is only allowed inside a loop or switch, a labeled break is required to exit an if or do
(breadの後ろに)ラベルがないbreakはループやswitch内では使えません。ifやdoから抜けるにはラベル付きのbreakが必要です
【確認ver】Swift 2.1これらはループもswitchでもないところで書かれたときに出る。
飛び先のラベル指定に問題があるときに出る。
label1: for i in 0...9 {
print("in label1")
label2: for j in 0...9 {
print("in label2")
}
break label2 //エラー 'break' is only allowed inside a loop
}
何を卒業するのかわからない//(特殊な例)
label1: for i in 0...9 {
print("in label1")
label2: for j in 0...9 {
print("in label2")
if(j == 5) {
continue label3 //エラー 'continue' is only allowed inside a loop
}
}
}
飛び先のラベルが定義されていないときもこのエラーが出るif true {
break //エラー Unlabeled 'break' is only allowed inside a loop or switch
}
ifの前にラベルが必要。//4.0
func testFunc(condition: Bool) {
guard condition else {
break
} //エラー
}
guardから出るのにbreakを使った。この場合、returnを使うこと。Labels are only valid on loops, if, and switch statements
ラベルはループやif switch文でのみ有効です
//4.0
let a = 5
switch a {
case 0:
print(a)
case 1:
print(a)
defalut: //エラー
break
}
defaultのつづり間違い。switch文だけど使い方がおかしいのでエラー。Expected platform name
プラットフォームの名前が想定される
Expected ')' in availability query
#availableの引数部分に)が想定される。
//4.0
if #available(11.0, *) { //エラー
} else {
}
(iOS 11.0, *)ならOK。print
昔はよくわからないエラーメッセージだったが、Swift2.0あたりで引数で与えられたものをひとつひとつStringに変換していく処理に変更になったので素直でわかりやすくなった。この記事も書きやすくなった。ただprintln(昔の記法)を使ったときに出るエラーが「printを使ってください」ではなく別のものであることがある。パラメータの与え方はprintでは間違っていないものでも出てしまうので注意。'println()' is unavailable: use print("")
println()は使えなくなりました。print("")を使ってください
【確認ver】Swift 2.1【古い文法度】★★★println
Cannot invoke 'println' with an argument list of type '(***)'
その引数のリストではprintlnを実行できません
【確認ver】Swift 2.1【バージョンアップで修正される可能性が高い度】★★★println(古い方)を使って複雑な引数を与えると出る。printlnを使っていることがだめなのでprintを使えという内容を出して欲しい。バージョンアップで修正される可能性が高い。
print(新しい方)への引数の与え方としてはOKなものでも出る。
abc = 5
println("abcdef","abcdef",abc) //エラー、ただしprintの引数としてはOK
println(abc,"abcdef","abcdef") //エラー、ただしprintの引数としてはOK
println("abcdef",abc,"abcdef") //エラー、ただしprintの引数としてはOK
Cannot convert value of type '***' to expected argument type 'inout ...'
inoutが想定されているところで***を与えられても変換できません
【確認ver】Swift 2.1【バージョンアップで修正される可能性が高い度】★★★上のと同じように、println(古い方)を使って複雑な引数を与えると出る。printlnを使っていることがだめなのでprintを使えという内容を出して欲しい。バージョンアップで修正される可能性が高い。
print(新しい方)への引数の与え方としてはOKなものでも出る。
var abc = 5
println(abc,abc) //エラー、ただしprintの引数としてはOK
println("abcdef",abc) //エラー、ただしprintの引数としてはOK
println(abc,"abcdef") //エラー、ただしprintの引数としてはOK
'print' is unavailable: Please wrap your tuple argument in parentheses: 'print((...))'
(引数なしでの)printは使えません。丸カッコの中にタプルで引数を入れてください。
【確認ver】Swift 2.1print()
Invalid character in source file
ソースファイルに無効な文字があります
【確認ver】Swift 2.1【語】Invalid 無効なvar num = 3
print(\(num)) //エラー
""内ではないのに\()記法を使った。これはprint(num)とすれば受け付ける。var num = 3
print("There are" + \(num)) //エラー
print("There are" , \(num)) //エラー
""内ではないのに\()記法を使った。それぞれprint("There are \(num)")とすればOKFix-itが出てきますが、それを適用しても変になります。
Expression implicitly coerced from '***?' to Any
***?からAnyに裏で強制変換されます
【確認ver】Swift 3.1【語】coerce に強制する"be+受け身"のbe動詞がない?
//3.1
var a: Int? = 0
print(a) //エラー
printにオプショナルを与えたときSwiftのバージョン変化
'A***' has been renamed to 'B***'
A***は名前が変わってB***になりました
【確認ver】Swift 3.0.2【古い文法度】★★★//Swift 3.0.2
NSBundle //エラー Bundleになった
NSFileManager //エラー FileManagerになった
FileManager.defaultManager //エラー FileManager.defaultになった
//Swift 3.0.1
class A: UIView {
func funcA() {
let next = self.nextResponder //エラー
}
}
nextResponderはnextになった。//Swift 2.1
println("こんにちは") //エラー
printlnはprintになった。Swift 2.1のときは名前が変わって間もないのでこの親切なエラーメッセージだったが、Swift3.1ではUse of unresolved identifier 'println'という冷たいメッセージになった。
Argument A*** must precede argument B***
引数A***は引数B***より先にあるべき
【確認ver】Swift 3.0.2//Swift 3.1
var abc = [Int](count: 10, repeatedValue: 1) //エラー
countとrepeatedValueはあるバージョンで位置が入れ替わった。(他に名前の変更もあり)//Swift 3.1
func abcFunc(a: Int, b: Int){
}
abcFunc(b: 4, a: 1) //エラー
決められた順番でやらないとだめ。Argument A must precede unnamed argument #*
引数Aはの名前の無い*番目ラベルより先にしないといけません
【確認ver】Swift 3.1//Swift 3.1
func abcFunc(a: Int, b: Int){
}
abcFunc(4, a: 1) //エラー
aが初めに来るべきだが、謎の4がある。その他、Expected系など
SwiftのコンパイルエラーではExpectedという単語がよく出てきます。単純に訳すと期待されているという意味ですが、書かれることが想定されているものが何かあるがそれが書かれていない、というニュアンスで使われることが多いです。Use of unresolved identifier '***'
コンパイラが判断出来ない何か('***')が書かれている
【確認ver】Swift 3.1//Swift 3.1
var aInt = 0
switch aInt {
case 0:
fall //エラー
case 1:
break
default:
break
}
この場合はfallではなくてfallthrough。//Swift 3.1
swich //エラー
宣言されていないものが書かれている。この場合はつづり間違い。//Swift 3.1
enum Blood {
case A
case B
case O
case AB
}
let abc = Blood.A
switch abc {
case A: //エラー
print("A")
case B: //エラー
print("B")
case AB: //エラー
print("AB")
case O: //エラー
print("O")
}
enumの要素を書く時に先頭の.(ドット)を忘れた時。switch文のcaseの表記など。//Swift 3.1
print(Hello, world) //エラー
本来""で囲むべきところでそれを忘れている//Swift 3.1
var a = (1, 2)
switch a {
case (value, 0...10): //エラー
print("")
case (0...10, value): //エラー
print("")
default:
print("")
}
case内でlet忘れ//Swift 3.1
var a: Int = 0 {
get { //エラー
return 2.0 * M_PI
}
}
Use of unresolved identifier 'get'とコンパイラに言われる。ストアドプロバティ定義と演算プロパティ定義が混乱している。演算プロパティにしたいなら=0の初期値はいらない。//Swift 3.1
println("こんにちは") //エラー
Expected declaration
宣言が期待される
【確認ver】Swift 3.0.2【語】declaration 宣言何かを宣言をするつもりで途中でやめたとき
宣言を書かないといけないところで何か変なものを書いたときに出る
//Swift 3.1
class A {
a = 0 //エラー
static b: Int = 0 //エラー
}
varかlet忘れclass TestView: UIView {
//クラス定義の閉じ括弧}がない
//ファイルの終わりでエラー
クラス定義の閉じ括弧}忘れは宣言の未完成と判断されてこのエラーが出るclass SomeClass {
let someInstance: Int
someInstance = 5 //エラー
init() {
}
}
宣言済みの変数にこの場所で値を与えることは出来ない。宣言と同時に初期値を与えることは出来る。Expected expression
(正しい)式が期待される
【確認ver】Swift 2.1かなりいろいろな状況で出る。コンパイラが分析しているときに予期していないものが出てきた場合に多い。
予想だが、このエラーは何か「書かれる必要があるもの」が書かれていないときに出るのではないか、と思われる。また、その「書かれる必要があるもの」はエラー箇所より前の部分にヒントがあることもある、と思われる。
(例1)何かを書くつもりで途中でやめた
(例2)別の言語の文法で書いた。例えばObjective-Cなど
let a: Bool = true
var b = a? 1:0 //エラー
3項演算子のつもりでプログラムを書いているがコンパイラにはオプショナルチェインと認識されて、その後の1:0が理解できない。3項演算子にしたいなら?の前にスペースを入れるとできる。var b = a ? 1:0
これは専門のエラーメッセージが作れそう。
let paramFunc = { a: Int -> Int in
let b = a * a
return b
}
引数部分のa: Intを(a: Int)にするとOK。Expected pattern
(正しい)パターンが期待される
【確認ver】Swift 4.0.2//4.0.2
let abc = 3
let //エラー
if abc == 5 {
}
letの後が抜けているExpected expression in list of expressions
式のリストで何かの式が期待される
【確認ver】Swift 3.0.2//Swift 3.0.2
func testValArg(a: Int, b: Int...) {
}
testValArg(a: 1, b:) //エラー
可変長引数に渡す引数が0個のときは外部引数名もいらない。Expression resolves to unused l-value
書かれている式は使用されないl-valueと判断されました
【確認ver】Swift 2.1var abc: String
abc //エラー
単に変数を書いただけで何の処理もしないときに出る。playgroundのプログラムをコピペしたときなどにも出るかも。l-valueというのはコンパイラの内部で使われる専門用語か?
Expected ',' separator
,が期待される
【確認ver】Swift 4.0.2//4.0.2
var abc = [1 2 3]
配列の表現で要素間の,が抜けている//4.0.2
func variableFunc(a: Int, b: Int...) {
}
func testFunc() {
variableFunc(a: 4, b: 4 4 4) //エラー
}
b: 4, 4, 4とするとOKExpected initial value after '='
=の後に初期化の値が期待される
【確認ver】Swift 4.0.2//Swift 4.0.2
var a = //エラー
'A***' is unavailable: Use 'B***' value 'C***' instead
A***は利用できません。変わりにC***を使って下さい。C***の性質はB***というものです。
サンプルコード保存し忘れ。詳細不明。Invalid character in source file
不正な文字です
【確認ver】Swift 4.0.2//Swift 4.0.2
let a = "a" //エラー
全角スペースがある場合Unicode curly quote found, replace with '"'
ユニコードの渦巻き状の引用符が見つかりました。"に変更してください。
【確認ver】Swift 4.0.2【語】curly 渦巻き状の quote 引用符【おしゃれ度】★★★★★//4.0.2
let abc = “ABC” //エラー
(どこかから持ってきたときに)エディターの何かの機能で"がおしゃれなやつに自動変換されていたUnexpected end of block comment
あるべきでないコメントブロックの閉じ
【確認ver】Swift 3.0.2コメント開始記号/*に比べて閉じ記号*/が多いとき
//Swift 3.0.2
/*
コメント
*/
*/ //エラー
Unexpected ',' separator
期待していない区切りの,
【確認ver】Swift 3.0.2//Swift 3.0.2
func func123(a: Bool, b: Bool) {
}
class A {
func call123() {
func123(true,) //エラー
}
}
2つ引数が必要な関数の呼び出しで、引数のところを(abc,)としている。本当は「引数が足りません」というメッセージの方がふさわしい。Extraneous '}' at top level
トップレベル(クラス宣言内や関数宣言内ではない)に}がある
【確認ver】Swift 2.1【語】Extraneous 本質的でない 外部から来たどこかで{が抜けているか、単純に}が多い。
Declaration is only valid at file scope
宣言はファイルスコープでのみ有効になります
クラスの定義の中でプロトコルを宣言した。class AAAA {
protocol AAAAA { //エラー
}
}
Closure expression is unused
使われないクロージャ
【確認ver】Swift 4.0{}などで囲まれた部分が何かの原因で無効になった?
{}より前で何か問題がある場合にも出る
//4.0
func testFuncAAA() {
{ //エラー
var a = 0
}
}
意味の無い{}囲み//4.0
infix operator +-(a: Int, b: Int) {} //エラー
演算子の宣言では引数がいらないのでそこでコンパイラが処理できない。その後の{}で当エラー。//4.0
if #available(11.0, *) {
} else {
}
(iOS 11.0, *)ならOK。Type of expression is ambiguous without more context
書かれているものは曖昧で、型を決定するためにもう少し何かが必要
【確認ver】Swift 2.0【語】ambiguous あいまいだvar abc = ["A", 0, (1.2,3.5)]
タプルとタプル以外の共存はだめらしいenum ABC {
case a
case b
case c
}
func funcABC() {
var aa = .a //エラー
//var aa = ABC.a これなら型が確定
}
enumの要素を型が確定しない状態で使ったenum TestEnumUnion {
case testUnionStr(String)
case testUnionInt(Int)
}
let a = TestEnumUnion.testUnionInt(0)
if a == .testUnionInt(0) { //エラー
}
if a == .testUnionInt { //エラー
}
if .testUnionInt(0) == a { //エラー
}
if .testUnionInt == a { //エラー
}
if case a = .testUnionInt(0) { //エラー
}
if case a = .testUnionInt { //エラー
}
if case .testUnionInt(0) = a { //OK
}
if case .testUnionInt = a { //OK
}
//Swift 3.0.2
var abc = [Int](repeating: 1.0, count: 10)
これはどういう経緯でambiguousと言っているのだろう?'***' is ambiguous for type lookup in this context
***はどの型なのかあいまい
【確認ver】Swift 4.0【語】ambiguous あいまいだ//4.0
enum TestEnum {
case aa(Int)
case bb(TestEnum)
}
enum TestEnum {
case aa(Int)
case bb(TestEnum)
}
Consecutive statements on a line must be separated by ';'
一行に連続して文を書く時は;で区切って下さい
Consecutive declarations on a line must be separated by ';'
一行に連続して宣言を書く時は;で区切って下さい
【確認ver】Swift 4.0.2【語】Consecutive 連続したコンパイラが混乱したときに出るようだが、かなりいろいろな状況で出る。同時に出ているものが他にあるときは他のものの方にヒントがあることが多い。
//4.0.2
func abc() String { //エラー
return "a"
}
->がない//4.0.2
let a = 1
let b = 2
let c = a *b //エラー
演算子の前後は空白を開けるなら両方開ける、開けないなら両方開けない。a * bのように演算子の前後の空白を揃えると出なくなる。
//4.0.2
var a: Int?
//この間になにやらいろいろある
var b: Int = a?? 0 //エラー
a ?? 0のように??の両サイドに空白を空けるとOK//4.0.2
class A {
}
extention A { //エラー
}
extentionではなくてextensiondid you mean to use '***'?
やりたいことは***を使ったら出来ませんか?
【確認ver】Swift 4.0.2提案項目があるときに出る。精度はまあまあ。
Statement cannot begin with a closure expression
ステートメントはクロージャ式で始めることは出来ません
【確認ver】Swift 2.2{}での前の部分に何か問題があることが多い
infix operator +-() {} //エラー
演算子の宣言には()が入らないのでそこでコンパイラが処理できない。よって、その後の{}で当エラーメッセージ。Inheritance from non-protocol, non-class type '***'
Expected '{' in class
プロトコルでもクラスでもない***から継承できません
class(の定義)では{が期待される
【確認ver】Swift 4.0.2//4.0.2
class A {
class a: Int = 0 //エラー
}
classの定義と判断されているvarかlet忘れ
static var a:Int = 0ならOK
static let a:Int = 0ならOK
class varとしたいなら演算プロパティにするとOK
class letはNG。classにするなら演算プロパティにしないといけないし、演算プロパティはletに出来ないので。
Expected 'let' in conditional
条件部にletが期待される
【確認ver】Swift 3.0//Swift 3.0 var x: String? var y: String? if let a = x, b = y { //エラー }
Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions
手頃な時間で解釈出来ません。分割を検討してください。
【確認ver】Swift 3.0.1【語】reasonable 適切な、手頃な distinct 別々の//Swift 3.0.1 let radius = 5.0 let ratio = 0.5 var subRadius: CGFloat = sqrt(pow(radius / 2, 2) + sqrt(3) / 2 * radius * (1 - ratio)) //エラー式自体は特に複雑でもないけど、左辺に書かれたCGFloatが右辺の計算に影響している。CGFloatを省いて、右辺を好きにやらせるとエラーは出ないパターン。
A*** has been replaced by B***
A***はB***に変更になりました
【確認ver】Swift 3.0SwiftのバージョンアップでA***がB***に変更された時
Expected parameter name followed by ':'
:を最後に付けたパラメータ名が必要
【確認ver】Swift 4.0//4.0
func twoParamFunc(#a: Int, b: Int) { //エラー
}
このような#を使う用法はすでに廃止になった。#はいらない。Expected an attribute name
属性の名前が期待される
Swift 2.1より前で出た。Swift 2.1以降は未確認。var abc: String
abc = @"abc"
Stringのインスタンスに@はいらない。他のメッセージに変更になった。
Cocoa
'IBOutlet' property has non-optional type '***'
非オプショナル型の***にIBOutletが付いています
【確認ver】Swift 2.1非オプショナル型はだめらしい
#selector
//3.1
//正しい使い方
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(
timeInterval: 0.1,
target: self,
selector: #selector(nanikaCheck(timer:)),
userInfo: nil,
repeats: false)
}
func nanikaCheck(timer: Timer) {
print("nanika")
}
Cannot convert value of type 'Timer.Type' to expected argument type 'Timer'
Timer型を入れる引数にTimer.Typeを渡しても変換できません
【確認ver】Swift 3.1//3.1
selector: #selector(nanikaCheck(timer: Timer)),
:のうしろは何も書かないこと。Missing argument label 'timer:' in call
timerラベルが必要
【確認ver】Swift 3.1//3.1
selector: #selector(nanikaCheck(_: Timer)),
timer:は省けない。Expected Expression in list of expression
式が期待される
【確認ver】Swift 3.1//3.1
selector: #selector(nanikaCheck(:)),
Use of unresolved identifier 'nanikaCheck'
nanikaCheckが何かわからない
【確認ver】Swift 3.1//3.1
selector: #selector(nanikaCheck(_:)),
nanikaCheckはtimerラベル付きで宣言されているので、ラベルなしの呼び出しは何なのかわからない。Objective-Cと連携
Argument of '#selector' refers to instance method '***' that is not exposed to Objective-C
#selectorの引数にObjective-Cから見えないメソッドが渡されました。
【確認ver】Swift 3.1//Swift 3.1
class SomeClass {
func someFunc() {
}
}
let sel = #selector(SomeClass.someFunc) //エラー
Objective-Cから見えるためにはSomeClassがNSObject(かそのサブクラス)を継承するか、someFuncメソッドに@objcを付ける。Objective-Cのつもりで書いてしまった
'YES' is unavailable : Use 'Bool' value 'true' instead
'NO' is unavailable : Use 'Bool' value 'false' instead
YESは使えません。代わりにtrueをBool値として使ってください
NOは使えません。代わりにfalseをBool値として使ってください
【確認ver】Swift 3.0.2//Swift 3.0.2
var result = NO //エラー
Consecutive statements on a line must be separated by ';'
連続した文は;で区切ってください
【確認ver】Swift 3.0.2//Swift 3.0.2
String abc = "あいう" //エラー
Objective-C風の宣言方法//Swift 3.0.2
let a = 1.0
let b = (Int)a //エラー
/code>
Objective-C風のキャストString literals in Swift are not preceded by an '@' sign
Swiftの文字列は頭に@を付けません
【確認ver】Swift 3.0.2【語】precede 先行する//Swift 3.0.2
let abc = @"あいう" //エラー
Use of undeclared type 'Boolean'; did you mean to use 'DarwinBoolean'?
Booleanは定義されていません。やりたいことはDarwinBooleanで出来ませんか?
【確認ver】Swift3.0.2//Swift 3.0.2
var abc: Boolean = true //エラー
trueは通常Bool型。Single-quoted string literal found, use '"'
シングルクオテーションリテラル(要するに ' で挟まれたもの)が見つかりました。" にして下さい。
【確認ver】Swift 3.0.2C言語の文字表現はだめ。
//Swift 3.0.2
var a: Character = 'a' //エラー
コンパイルエラー以外(Xcodeが出すものなど)
Enable Recommended Warning
This will enable the following recommended compiler warning
オススメの警告を有効に
下記のオススメの警告を有効にします
【確認ver】Xcode 8.3.3Xcodeのバージョンを上げてワーニングの出し方か変わった場合、古いプロジェクトを立ち上げると出ることがある。この文章の下に箇条書きで有効にする警告が具体的に書かれる。
Read failed: The data couldn't be read because it isn't in the correct format.
読むのに失敗。正しい形式で書いてないのでデータは読めません。
【確認ver】Xcode 9.0.1Localizable.stringsの;忘れ
Expression implicitly coerced from "Error/" to Any
返信削除これはどのようにしたら良いでしょうか?
Any を受け付けるところにオプショナル型を入れようとしたときに出る警告です。文法的には Any はオプショナル型を受け付けますが、Any にオプショナル型を入れると == nil の比較が出来ない (常に true になる) など扱いにくい面があるようなので、オプショナル型をアンラップしなくてよいか念のためにコンパイラが確認の文を出しています。アンラップして代入するのがよいと思います。
削除Swift 3.0.2