2016-06-02 4 views
4

나는 신속한 초보자이며 일할 대안을 얻으려고 서클을 돌고 있습니다. 제가 인터넷 검색을 많이 해봤 등 애플 문서를 읽을 수 있지만 나는 (간체) 내의 ViewController 니펫이와 사투를 벌인거야 :신속한 문제 (선택 사항)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "segueToWebView") { 
     // check what we're passing around 
     print(sender!.urlString) // Optional("http://www.bbc.co.uk") 

     // do some url validation etc 
     var destUrl:String 
     if sender!.urlString == nil{ 
      destUrl = "http://www.google.com" 
     } else { 
      destUrl = sender!.urlString // *** Error here *** 
     } 

     let targetWebViewController:GDWebViewController = segue.destinationViewController as! GDWebViewController 
     targetWebViewController.loadURLWithString(destUrl) 
     targetWebViewController.showsToolbar = true 
     targetWebViewController.title = sender!.busName // this works correctly too (so isn't that a String?) 
    } 
} 

오류는 위의 표시 줄에 Cannot assign value of type 'String?!' to type 'String'입니다. 나는 그것을 다른 방법으로 풀지는 않았지만 그것을 이해할 수 없다.

더 코드

보낸 사람은 다음과 같은 구조의 정의있는 UIButton의 서브 클래스입니다 : 내가 알고하지 않는 옵션으로 변수를 설정 한

import UIKit 

class TestButton: UIButton { 
    var urlString: String? 
    var busName: String? 
} 

버튼 여부/이러한 속성을 갖지 않습니다.

버튼을 탭 때 호출되는 방법은 이것이다 :

func tapTap(sender: TestButton) { 
    print(sender.busName, sender.urlString) // Optional("My Button") Optional("http://www.bbc.co.uk") 
    self.performSegueWithIdentifier("segueToWebView", sender: sender) 
} 

내가 스위프트 선택적 항목을 알고 나 같은 초보자를위한 공통의 걸림돌이며, 그들에 대한 문서가 많이있다하지만 난 알아낼 수 없습니다 도움이된다면 도움이 될 것입니다.

+0

'print (sender! .urlString)'코드의 세 번째 줄은'AnyObject'에'urlString' 멤버가 없으므로 컴파일해서는 안됩니다. –

+0

'var destUrl : String'을'var destUrl : String? '으로 대체하고 –

+0

을 시도해주세요. 감사합니다. - 이제 기차에 타고 있으므로 최대한 빨리 제안을 확인하고 다시 게시 할 것입니다. – James

답변

10

은 세 가지 수준에서 선택적 항목을 다음과 같습니다

  • sender: AnyObject? 매개 변수는 선택 사항입니다.
  • AnyObject에 임의의 메시지를 보내면 선택적인 체인과 유사하게 동작하고 암시 적으로 래핑되지 않은 옵션 (The strange behaviour of Swift's AnyObject 비교)을 반환합니다.
  • var urlString: String? 속성은 선택 사항입니다.

는 처음 두 선택적 항목을 해결 사용하는 선택적 바인딩 /를 콘크리트 버튼 클래스에 캐스팅 :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "segueToWebView") { 
     if let button = sender as? TestButton { 
      // The type of `button` is `TestButton` 
      // ... 
     } 
    } 
} 

지금

var destUrl: String 
if button.urlString == nil { 
    destUrl = "http://www.google.com" 
} else { 
    destUrl = button.urlString! 
} 

컴파일 것입니다,하지만 더 나은로 처리됩니다 nil-coalescing operator :

let destUrl = button.urlString ?? "http://www.google.com" 

연산자가 더 이상 풀려지지 않습니다. ! 연산자!

+0

대단한 답변을 보내 주셔서 감사합니다! 나는 "optionals 내에서 optionals"문제가 있다는 것을 깨달았지만 당신의 도움없이 해결책을 찾지는 못했을 것입니다. 나는 두 번째 코드 묶음을'if let' 안에 넣었습니다. 그러면 제대로 작동하는 것처럼 보였습니다. 도와 줘서 고마워. – James

3

당신은 같은 것을 할 필요가 :

var destUrl:String 
if let durl = sender!.urlString { 
    destUrl = durl 
} else { 
    destUrl = "http://www.google.com" 
} 

코드의 문제는 destUrl는 문자열 만 보낸 점이다 .urlString는 선택 사항입니다!. 따라서 하나를 다른 것에 할당 할 수는 없습니다. 지정하기 전에 선택 사항의 포장을 풀어야합니다. 어느 쪽이든 그것을 언 래핑하면 (함께!)하자. 나는 너에게 달려 있지만 그것은 권할 만하다.

3

수동 nil의 캐릭터를 테스트하지만 당신은 그것을 랩을 해제하는 것을 잊지 :

var destUrl:String 
if sender!.urlString == nil{ 
    destUrl = "http://www.google.com" 
} else { 
    destUrl = sender!.urlString! 
} 

(추가 느낌표를 참조하십시오.)

그러나이 같은 문자열을 풀기 실제로 같은 더 쉽다 이 : nil을위한

let destUrl = sender!.urlString ?? "http://www.google.com" 

?? 조작 테스트는 모든 한 행에 펼쳤다 또는 오른쪽을 반환한다.

+0

팁에 대해 감사합니다 ?? 연산자 - 미래에 확실히 편리 할 것입니다. – James