2017-08-06 2 views
0

マッピング配列自身が表現可能なので、エラーが発生するのはなぜですか?私はこれを試してい

var orientations1: UIInterfaceOrientationMask = [.portrait, .landscapeRight] 
var orientations2: UIInterfaceOrientationMask = [.portrait, .landscapeRight].map { $0 } 

orientations1が正常に動作しますが、orientation2次のエラーを生成します。

Type of expression is ambiguous without more context

UIInterfaceOrientationMaskExpressibleByArrayLiteralプロトコルに間接的に準拠しています。 .map { $0 }はおそらくアレイの内容を変更することができますし、それを動作させるにはどうすればよいですか?

オーケー

UPDATEので、ここで私が何をしようとしているのです。私はSwiftを学んでおり、実行時にデバイスの向きを変えて遊びたい。だから今、すべてのUI要素は、そのタグが適切な方向マスクの生の値に設定されたスイッチ

switchPortrait.tag = Int(UIInterfaceOrientationMask.portrait.rawValue) 
switchLandscapeRight.tag = Int(UIInterfaceOrientationMask.landscapeRight.rawValue) 
switchPortraitUpsideDown.tag = Int(UIInterfaceOrientationMask.portraitUpsideDown.rawValue) 
switchLandscapeLeft.tag = Int(UIInterfaceOrientationMask.landscapeLeft.rawValue) 

orientationSwitches = [switchPortrait, switchLandscapeRight, switchPortraitUpsideDown, switchLandscapeLeft] 

for switchElement in orientationSwitches { 
    switchElement.isOn = orientations.contains(UIInterfaceOrientationMask(rawValue: UInt(switchElement.tag))) 
} 

@IBOutlet weak var switchPortrait: UISwitch! 
@IBOutlet weak var switchLandscapeRight: UISwitch! 
@IBOutlet weak var switchPortraitUpsideDown: UISwitch! 
@IBOutlet weak var switchLandscapeLeft: UISwitch! 

var orientationSwitches = [UISwitch]() 
var orientations: UIInterfaceOrientationMask = [.portrait, .landscapeRight, .landscapeLeft, .portrait] 

方法viewDidLoad()では、私はこれやってる:

私は4つのスイッチを持っています。また、初期状態であるorientationsに従って、すべてのスイッチがオンまたはオフになります。スイッチング動作で

、私はこのようなorientations更新しようとしている:

@IBAction func orientationSwitched(_ sender: UISwitch) { 
    orientations = orientationSwitches.filter({ $0.isOn }).map({ UIInterfaceOrientationMask(rawValue: UInt($0.tag)) }) // doesn't work 
} 

をしかし、それは動作しません。そして、私はsupportedInterfaceOrientationsは、単に次のようになります。

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    return orientations 
} 

私は、各UIスイッチ素子用insert()メソッドを介してそれを行うことができるんだけど、私はそれがマッピングによって、よりエレガントな方法で行うことができるかどうか知りたいです。

+0

'UIInterfaceOrientationMask'は、* *のは、option *なく*の配列です。したがって、配列リテラルで初期化することはできますが、配列に代入することはできません。これは 'map'が返すものです。 – vacawama

+0

恐ろしいですが、動作します: 'var orientations2:UIInterfaceOrientationMask = [UIInterfaceOrientationMask.portrait、.landscapeRight] .map {$ 0} .reduce(UIInterfaceOrientationMask()){var result = $ 0; result.insert($ 1); return result} ' – vacawama

+0

@vacawama、あなたは' union'を使うことができ、 'UIInterfaceOrientationMask()'は '[]'で置き換えることができます。 – OOPer

答えて

1

スウィフトでは、リテラルはタイプがなく、そのタイプはコンテキストによって推論されます。

スウィフトはArray< UIInterfaceOrientationMask>として配列リテラルの種類を推測する場合は、あなたの場合、あなたは.map{ $0 }を適用することができますが、結果もArray<UIInterfaceOrientationMask>なり、UIInterfaceOrientationMaskに変換することはできません。 (下記を参照してください)

スウィフトが配列リテラルの型をUIInterfaceOrientationMaskと推測した場合、mapは利用できません。

したがって、Swiftはあなたの宣言に一致するタイプを見つけることができません。その結果、Type of expression is ambiguous without more contextとなります。


あなたが別のスレッドのコメントで示唆されてきたように、ExpressibleByArrayLiteralは、文脈に応じて配列リテラルを解釈するために、コンパイラによって使用されます。配列が自動的にExpressibleByArrayLiteralに適合する型に変換されることを意味するものではありません。 UPDATE

については


ご覧のとおり、UIInterfaceOrientationMaskArrayを取って何の通常の初期化子を持っていません。したがって、insertを使用することは安定した方法の1つです。定常的なコードは、一見スマートだが壊れやすい、または読みにくいコードよりもエレガントである。

あなたは一見スマートコードを使用して主張した場合、あなたはこのような何か書くことができます。

@IBAction func orientationSwitched(_ sender: UISwitch) { 
    orientations = orientationSwitches 
     .filter{$0.isOn} 
     .map{UIInterfaceOrientationMask(rawValue: UInt($0.tag))} 
     .reduce([]) {$0.union($1)} 
} 
+0

できることはありますか?私は 'UIInterfaceOrientationMask'型にいくつかのUI要素の配列を' tag'プロパティーでマップしたいと思います。言い換えれば、私の4つのUI要素は、それぞれ異なるデバイス方向を表しています。 –

+0

@RoboRobok、あなたが本当にやりたいことは十分にはっきりしていません。より具体的で具体的なサンプルコードをいくつか追加してください。 – OOPer

+0

質問が更新されました。 –

1

Type of expression is ambiguous without more context

Map関数を出力としてarray値を返すため。だから、目的のmap関数出力を得るには、このように推測型をarrayに変更する必要があります。

let orientations2: [UIInterfaceOrientationMask] = [.portrait, .landscapeRight].map { $0 } 
+0

'UIInterfaceOrientationMask'は' ExpressibleByArrayLiteral'に準拠しており、配列で表現できます。 '[UIInterfaceOrientationMask] 'ではなく' UIInterfaceOrientationMask'型が必要です。 –

+0

@RoboRobok、あなたの意見は理にかなっています。しかし、あなたはそのエラーを解決する必要があると思った。したがって、推論された型を配列として定義することができます。 –

+0

私は何をしようとしているのか、より具体的な記述を含んでいます。 –

関連する問題