2017-01-28 3 views
2
내가 문자열에 원하는

, 즉 다른 일정 String "_TRALLALA"스위프트 3 옵션

이 이렇게 잘 작동로 구분됩니다 랩핑 해제 :

if let lb = s2.range(of: "_TRALLALA")?.lowerBound 
{ let s3 = url.substring(to: lb) 
// do something 
} 

내가 하나의이 말씀을드립니다 다음과 같이 할 경우 :

if let s3 = url.substring(to: s2.range(of: "_TRALLALA")?.lowerBound) 
{ // do something 
} 

하지만 내가 얻을 :

Value of optional type String.Index? not unwrapped 

것을 제대로 표현하는 방법

+0

단일'if'를 함수에 랩핑하십시오! – Sulthan

답변

2

당신이 원하는 것을 할 수있는 기본 기능은 그러므로 당신이 함수로 포장해야 할 것 없다 :

extension String { 
    func substring(delimitedBy: String) -> String? { 
     guard let range = self.range(of: delimitedBy) else { 
      return nil 
     } 

     return self.substring(to: range.lowerBound) 
    } 
} 

if let s3 = url.substring(delimitedBy: "_TRALLALA") { 
    // ... 
} 
3

map옵션과 함께 사용할 수 있습니다 값을 랩핑하여 사용하거나 nil 인 경우 nil을 반환합니다. 이 사용 명세서는 다음과 같이 쓸 수있다 : (약간 짧은)

if let s3 = (s2.range(of: "_TRALLALA")?.lowerBound).map({ url.substring(to: $0) }) { 
    // do something 
} 

또는 이동 lowerBoundmap 후 : 한 줄에

if let s3 = s2.range(of: "_TRALLALA").map({ url.substring(to: $0.lowerBound) }) { 
    // do something 
} 
1
var s2 = "Hello, playground" 

var url = "some url" 


let delimiter = "_TRALLALA" 
let r = s2.range(of: delimiter) ?? s2.startIndex..<s2.startIndex // if found nil then assigning empty Range 

let s3 = url.substring(to: r.lowerBound) 
if s3 != "" { 
// do something 
} 

let s3 = url.substring(to: (s2.range(of: "_TRALLALA") ?? s2.startIndex..<s2.startIndex).lowerBound) 
if s3 != "" { 
// do something 

} 
1
if let s3 = s2.range(of: "_TRALLALA").flatMap { url.substring(to: $0.lowerBound) } 
{ 
    // do something 
}