func myFunc(array:[Int]) -> (min: Int, max: Int)?
{
if array.isEmpty {return nil}
var minNumber = array[0]
var maxNumber = array[0]
for number in array {
if number < minNumber {
minNumber = number
}
else if number > maxNumber{
maxNumber = number
}
}
return (minNumber, maxNumber)
}
let tempArray:[Int] = [1,2,3,4,5,6,7]
let value = myFunc(array: tempArray)
print("The minima is: \(value?.min != nil ? value!.min : nil) the maxima is \(value?.max != nil ? value!.max : nil)")
例如,在给定的代码中,我只是想让代码包含某个值,它将强制展开,但是如果不包含该值,则将仅显示“ nil”。但是在我的代码中,如果包含数字,它将打印Optional(一些数字)。
value?.min != nil ? value!.min : nil
是(有条件的)expression,并求值为具有type。
的某个值第一个表达式value!.min
具有类型Int
,但是第二个表达式nil
是可选的并且具有类型Int?
。因此,条件表达式的类型变为Int?
,并打印为“ Optional(1)”。
您想要的是string“ nil”,或非nil值作为字符串:
print("The minimum is: \(value?.min != nil ? "\(value!.min)" : "nil")")
(以及类似的最大值)。现在两个表达式都在条件表达式中
value?.min != nil ? "\(value!.min)" : "nil")
是strings,,结果也是一个字符串。可以缩写为
print("The minimum is: \(value.map {"\($0.min)"} ?? "nil")")
如果经常需要,则可以在可选类型上定义扩展方法
extension Optional {
var descriptionOrNil: String {
switch self {
case .some(let wrapped): return "\(wrapped)"
case .none: return "nil"
}
}
}
并用作
print("The minimum is: \((value?.min).descriptionOrNil)")
所以,如果我不明白这个问题是错的。您可以这样做:
extension Optional where Wrapped == Int {
var valueOrEmpty: String {
guard let unwrapped = self else {
return "nil"
}
return "\(unwrapped)"
}
}
print("The minima is: \(value?.min.valueOrEmpty) the maxima is \(value?.max.valueOrEmpty)")
对吗?