Swift更新后报错:[(NSLayoutAttribute, Double/Int)]表达式类型上下文不足致歧义
[(NSLayoutAttribute, Double)] and [(NSLayoutAttribute, Int)] After Swift Update Hey there! Those ambiguity errors are super common when Swift tightens up its type inference rules in newer versions—let's break down how to fix them quickly.
Why This Happens
Swift's compiler used to be a bit more lenient about inferring the type of tuple arrays when context was vague. After your update, it now requires explicit type hints because it can't automatically tell whether you mean an array of (NSLayoutAttribute, Double) or another similar tuple type just from literal values alone.
Solution 1: Explicitly Annotate the Array Type
The simplest fix is to add a clear type annotation when declaring the array. Here's how to apply it to both of your error cases:
For the [(NSLayoutAttribute, Double)] Error
// Explicitly define the array type to resolve ambiguity let layoutDoubleAttributes: [(NSLayoutAttribute, Double)] = [ (.width, 300.0), (.height, 150.0) ]
For the [(NSLayoutAttribute, Int)] Error
// Same approach—explicit type removes confusion for the compiler let layoutIntAttributes: [(NSLayoutAttribute, Int)] = [ (.leading, 24), (.trailing, 24), (.top, 16) ]
Solution 2: Add Type Hints at the Point of Use
If you're using these arrays directly in a function call (instead of storing them in a variable), you can also specify the type inline when passing the argument. For example:
// Suppose you have a function that accepts [(NSLayoutAttribute, Double)] func applyDoubleLayout(_ attrs: [(NSLayoutAttribute, Double)]) { // Implementation here } // Call it with an explicit type cast applyDoubleLayout([(.width, 200.0), (.height, 100.0)] as [(NSLayoutAttribute, Double)])
Bonus: A Cleaner Alternative
If you find tuple arrays for layout attributes hard to read or maintain, consider using a custom struct to make your code more explicit:
struct LayoutAttributePair { let attribute: NSLayoutAttribute let value: CGFloat // Or Double/Int depending on your needs } let layoutPairs = [ LayoutAttributePair(attribute: .width, value: 300.0), LayoutAttributePair(attribute: .leading, value: 24.0) ]
This removes any ambiguity entirely and makes your code more self-documenting.
内容的提问来源于stack exchange,提问作者Tony Merritt

