2016-03-30 14 views
2

:Hızlı 3.0'da birden çok isteğe bağlı dizeyi nasıl birleştirebilirim? Ben hızlı 3'te birden dizeleri bitiştirmek çalışıyorum

var a:String? = "a" 
var b:String? = "b" 
var c:String? = "c" 
var d:String? = a! + b! + c! 

aşağıdaki hatayı alıyorum derlerken:

error: cannot convert value of type 'String' to specified type 'String?' 
var d:String? = a! + b! + c! 
       ~~~~~~~~^~~~ 

Bu o değil neden emin değilim hızlı 2. çalışmak için kullanılan Artık çalışmıyor. OP tarafından açılan

cevap

8

Hata raporu: çözüldüğünü

(2017 Oca 3 usta taahhüt fix) ve dolayısıyla artık yaklaşan Swift 3.1 bir sorun olması gerekir.


Bu bir hata gibi görünüyor (Swift 2.2 bulunmayan, sadece 3.0) durumunda ilişkili:

  • bir in en az 3 dönem için zorunlu unwrapping operatörü (!) kullanma ifade (en az 2 temel operatör kullanılarak test edilmiştir, örneğin + veya -).
  • Yukarıdaki nedenlerden ötürü, Swift'in ifadesi, ifade ifadesinin çıkarımını (özellikle, x! ifadesinin kendisinde, ifadede) çıkarır. Aşağıdaki tüm örnekler için

, izin:

let a: String? = "a" 
let b: String? = "b" 
let c: String? = "c" 

Hata mevcut: mevcut olmayan

// example 1 
a! + b! + c! 
    /* error: ambiguous reference to member '+' */ 

// example 2 
var d: String = a! + b! + c! 
    /* error: ambiguous reference to member '+' */ 

// example 3 
var d: String? = a! + b! + c! 
    /* error: cannot convert value of type 'String' 
     to specified type 'String?' */ 

// example 4 
var d: String? 
d = a! + b! + c! 
    /* error: cannot assign value of type 'String' 
     to specified type 'String?' */ 

// example 5 (not just for type String and '+' operator) 
let a: Int? = 1 
let b: Int? = 2 
let c: Int? = 3 
var d: Int? = a! + b! + c! 
    /* error: cannot convert value of type 'Int' 
     to specified type 'Int?' */ 
var e: Int? = a! - b! - c! // same error 

Hata:

/* example 1 */ 
var d: String? = a! + b! 

/* example 2 */ 
let aa = a! 
let bb = b! 
let cc = c! 
var d: String? = aa + bb + cc 
var e: String = aa + bb + cc 

/* example 3 */ 
var d: String? = String(a!) + String(b!) + String(c!) 

Ancak bu, Swift 3.0- dev olduğu gibi, bunun gerçekten bir "hata" olup olmadığı ve politikanın ne olduğunu bilmiyorum. kodun henüz üretilmemiş bir sürümünde "hatalar" bildirilmesi, ancak muhtemelen bunun için radarı dosyalamanız gerekir.

  • kullanımını örn: Bu sorunu aşmak için nasıl gibi soruya cevap gelince

    Hata mevcut olmadığı gibi ara değişkenler: yukarıdaki Örnek 2,

  • veya açıkça hata mevcut değil 3-vadeli ifade tüm terimler dizeleri Swift, söyle: Örnek 3 Yukarıdaki,
  • veya daha iyisi, isteğe bağlı güvenli unwrapping kullanın, örneğin bağlayıcı isteğe bağlı kullanarak:

    var d: String? = nil 
    if let a = a, b = b, c = c { 
        d = a + b + c 
    } /* if any of a, b or c are 'nil', d will remain as 'nil'; 
        otherwise, the concenation of their unwrapped values */ 
    
+2

Teşekkür cevap için, ben bir hata [burada] (https://bugs.swift.org/ açtı)/SR-1122 göz – DMSilva

0
let val: String? = "nil" 

val.flatMap({(str: String) -> String? in 
    return str + "value" 
}) 
1

Swift 3

let q: String? = "Hello" 
let w: String? = "World" 
let r: String? = "!" 
var array = [q, w, r] 

print(array.flatMap { $0 }.reduce("", {$0 + $1})) 
// HelloWorld! 


let q: String? = "Hello" 
let w: String? = nil 
let r: String? = "!" 
var array = [q, w, r] 

print(array.flatMap { $0 }.reduce("", {$0 + $1})) 
// Hello! 
İlgili konular