无法指定类型'字符串的值?'输入' String'

时间:2017-01-19 12:09:24

标签: swift

class C{
 var b:[String]?
 subscript(i:Int)->String?{
  get{
   return b?[i]
  }
  set{
   b?[i] = newValue! // notice the unwrapped “!” here
  }
 }
}

在代码中,我添加了感叹号"!"打开newValue, 因为newValue与下标的返回值是String?的类型相同。 如果我不把感叹号放在一起,那么!"!"它会报告错误:    "

  

错误:无法指定类型'字符串的值?'输入' String' b?[i] = newValue

" 问题:b?[i]显然是一个可选的String值String?,它是String类型的。 我不知道这是一个错误的错误代码

3 个答案:

答案 0 :(得分:2)

你的var b:[String]?是一个可选的数组。但是里面的字符串不是可选的。如果你把它改成:var b:[String?]?那就行了。

答案 1 :(得分:1)

您的属性b确实是一个可选的数组,但其成员元素是不是选项。因此,在尝试为现有成员分配新值时,新值必须是具体类型String,而不是可选类型String?

// this is an Optional array, with non-optional elements
var foo: [String]? = ["foo"]

let optStr: String? = "bar"
let nonOptStr = "bar"

// ok, nonOptStr is not an optional
foo?[0] = nonOptStr

// as for 'nonOptStr', we need to unwrap
// it prior to attempting to assign it as a 
// replacement member of 'foo'
if let str = optStr {
    foo?[0] = str
}

此外,避免显式展开,并考虑在使用之前验证索引。 E.g:

class C {
    var b: [String]?
    subscript(i: Int) -> String? {
        get {
            if b?.indices.contains(i) ?? false { return b?[i] }
            return nil            
        }
        set {
            if b?.indices.contains(i) ?? false, let newValue = newValue {
                b?[i] = newValue
            }
        }
    }
}

答案 2 :(得分:0)

更一般地说,在对字符串进行分割并最终打印出两个变量后,我发现自己遇到了这个确切的错误。这说明我正在尝试将两个元素变量分配给包含字符串的索引数组。因此,这就是错误的根源,从本质上讲,这是您试图将一个数组的两个元素分配给另一个数组内的字符串的错误。好吧,从错误中讲得通。
从算法上讲是: 1)array1 [0] = array2Item1,array2Item2

这就是为什么这很好: 2)array1 = array2Item1,array2Item2

但以上不是。

因此,正确的做法是2),然后按索引分配它:

array1 = array2Item1,array2Item2

array3 = array1 [0]做我想做的1)。

对于任何其他在这里冒险的人来说,只是另一种解释。