2016-10-08 1 views
0
スウィフト2.2まで、私はこれを行うことができた

最大:スウィフト3:配列の要素の異なる種類が許容されない

for each in [myUIButton,myUILabel] { 
each.hidden = true 
} 

が、スウィフト3で、これは受け入れられないが、ラベル、ボタンなどのためではありません同じ種類の要素。私はすでにそれは「異種コレクションリテラル...」エラーがスロー真each.isHidden =

を2行目を変更しました。 [Any]を追加して修正すると、「'AnyObject ..」にキャスト' Any 'がスローされます。

この問題は簡単に修正できますか?

for each in [myButton,myLabel,x,y,z] as [Any] { 
    each.hideen = true 
} 

しかし、その後、あなたがエラー原因Anyhideen(タイプミス?)と呼ばれる性質を持っていないでしょう。

+0

'myButton'、' myLabel'、 'X'、 'y'と' z'の種類は何ですか?それらがすべて 'UIView'から継承されている場合、コンパイラは配列を' [UIView] 'として推論できるはずです。いずれにしても、自己完結型の例が非常に役立ちます。 – Hamish

+0

説明と入力のために編集された質問 – Kashif

+0

これはまだ自己完結型の例ではありません。これは 'let a = UIView(); let b = UIButton(); [a、b] {view.isHidden = true} 'で見るために、それはうまくコンパイルされます。 – Hamish

答えて

1

isHidden性を有する共通の祖先クラスを見つけて、明示的にキャスト:

for each in [myUIButton, myUILabel] as [UIView] { 
    each.isHidden = true 
} 
+0

質問を理解していただきありがとうございます。いくつかのことを理解することなく質問を非難しているようです。 – Kashif

+0

スウィフト3とスウィフト2では何が違うのですか? – Honey

+1

@Honey、Swift 3は一般的にはコレクションの型を推測するのには不向きで、配列には '[Any]'を使う傾向があります。 – OOPer

0

はそれが[Any]配列ですスウィフトを教えてください。

+0

私はすでにこれを試しました。さらにエラーが発生します。 (解説とタイプミスのために編集された質問) – Kashif

+1

'isHidden 'を持つ' as [UIView] 'を使用してください – Andrew

1

配列のすべてのアイテムは、タイプ推論を行うために、おそらくmyButtonとmyLabelの場合はUIViewのような共通のサブクラスを持つ必要があります。

let label = UILabel() 
let button = UIButton() 
let collectionView = UICollectionView() 
let tableView = UITableView() 

let array = [label, button, collectionView, tableView] // Type: [UIView] 

for item in array { 
    item.isHidden = true 
} 

このコードはあなたの目的に適しています。

さらに、それらがすべて同じプロトコルに準拠している場合は、それらのプロトコルに明示的に名前を付ける必要があります。

protocol Commonality { 
    func commonMethod() { ... } 
} 

class ThingA: Commonality { ... } // Correctly conform to Commonality 
class ThingB: Commonality { ... } // Correctly conform to Commonality 
class ThingC: Commonality { ... } // Correctly conform to Commonality 

let array: [Commonality] = [ThingA(), ThingB(), ThingC()] 

for item in array { 
    item.commonMethod() 
} 

これもうまくいくはずですが、共通プロトコルを明示的に指定する必要があります。そうでなければ(少なくとも私のテストでは)、それはAnyまですべてをダウンキャストします。

関連する問題