2015-05-30 22 views
7

Tôi có một tuyên bố chuyển đổi đơn giản không đơn giản như vậy.Toán tử nhị phân '~ =' không thể áp dụng cho các toán hạng kiểu 'Chuỗi' và 'Chuỗi?'

switch(bubble?.name){ //bubble is SKPhysicsBody 
    case "largeBubble": // <= error 
     newBubbleSize = "medium" 
     break; 
    default: 
     newBubbleSize = "large" 
     break; 
} 

Ở đây tôi gặp lỗi mà tôi đã đề cập trong tiêu đề Binary operator '~=' cannot be applied to operands of type 'String' and 'String?'. Và tôi không biết tại sao nó là một vấn đề mà một trong số họ là một tùy chọn.

Trả lời

8

Optional Chaining, bubble?.name có loại String?. Bạn có một vài tùy chọn:

  • Sử dụng "largeBubble"? trong biểu thức case (chỉ Swift 2+).
  • Kiểm tra số 0 trước khi thực hiện switch, vì vậy đối số chuyển đổi sẽ là String thay vì String?.
  • Sử dụng bubble!.name (hoặc bubble.name nếu đó là một SKPhysicsBody!) nếu bạn là hoàn toàn chắc chắn rằng nó sẽ không được nil
+0

Option # 4: 'switch (bubble? .name ??" unknown ") {...}'. –

+0

Chắc chắn, nhưng sau đó bạn sẽ làm một so sánh không cần thiết với chuỗi "không rõ" trong một số trường hợp :) Tất nhiên, nó có thể quá nhanh đến mức không quan trọng ... – jtbandes

+0

'bubble! .name' không hoạt động - tốt, chỉ kết hợp với 'some()'. Nghĩ rằng đó là lý do tại sao luôn luôn có một mặc định là tốt ... nếu tên không được thiết lập. – Jurik

3

Như @ Jtbandes nói, vấn đề là kết quả của bubble?.name có loại String? . Một giải pháp thay thế, để những người đưa ra, là để ghi đè lên các nhà điều hành ~= để có một String?String như các đối số, ví dụ:

func ~= (lhs: String, rhs: String?) -> Bool { 
    return lhs == rhs 
} 

Hoặc, để làm cho nó chung chung hơn:

func ~= <T: Equatable>(lhs: T, rhs: T?) -> Bool { 
    return lhs == rhs 
} 
+0

'Equatable' sẽ là đủ :) –

+0

Chúc mừng cho điều đó, tôi đã cập nhật câu trả lời của mình. – ABakerSmith

1

“ Giá trị không bao giờ được chuyển đổi hoàn toàn sang loại khác. Nếu bạn cần phải chuyển đổi một giá trị cho một kiểu khác nhau, hãy dứt khoát một thể hiện của kiểu mong muốn.”

“let label = "The width is " 
let width = 94 
let widthLabel = label + String(width)” 

Đây chiều rộng là một kiểu Integer nó đã được chuyển đổi sang String String (Int) chức năng

0

Trong Swift 2.0 (người gửi: UIButton) sau đó! cho chuỗi chuyển đổi hoạt động.

let operation = sender.currentTitle! 

Trong Swift 2.0, (người gửi: AnyObject) rồi !! cho chuỗi chuyển đổi hoạt động.

let operation = sender.currentTitle!! 

lỗi mà tôi đã thực hiện đang sử dụng AnyObject thay vì UIButton.

@IBAction func operate(sender: AnyObject) { 
     let operation = sender.currentTitle!! 

     if userIsInTheMiddleOfTypeingNumber{ 
      enter() 
     } 

     switch operation{ 
      case "×": 
       if operandStack.count >= 2{ 
        displayValue = operandStack.removeLast() * operandStack.removeLast() 
       } 

       break 
//   case "÷": 
//    break 
//   case "+": 
//    break 
//   case "−": 
//    break 
      default: 
       break 
     } 

    } 
Các vấn đề liên quan