Diễn Đàn

Mac Toán tử nhị phân '>' không thể được áp dụng cho các toán hạng kiểu 'Double?' và 'Int'

abcdefg12345

Áp phích gốc
Ngày 10 tháng 7 năm 2013
  • Ngày 21 tháng 10 năm 2017
Tôi đang cố tạo câu lệnh if để kiểm tra xem giá trị kép trong một chuỗi có lớn hơn 10 hay không nhưng tôi muốn nhận được lỗi 'Toán tử nhị phân'> 'không thể áp dụng cho các toán hạng kiểu' Double? ' và 'Int' 'có ai biết tôi đang làm gì sai không.

nhanh chóng 4
Mã: if (Double(MyValue) > 10) { // value is bigger than 10 } else { // do something else }
tôi đang sử dụng một chuỗi biến vì tôi cần nó là một chuỗi để tôi có thể định dạng nó sau này, tôi đã định nghĩa nó là
Mã: var MyValue = ''

abcdefg12345

Áp phích gốc
Ngày 10 tháng 7 năm 2013


  • Ngày 21 tháng 10 năm 2017
đã sửa nó bằng cách thêm một biến khác
Mã: let CheckValue = Double(MyValue)! if CheckValue > 10 { }
Phản ứng:960design

0002378

Cấm
Ngày 28 tháng 5 năm 2017
  • 23 tháng 10, 2017
Tôi nghĩ rằng Swift, với tư cách là một ngôn ngữ, đôi khi khá buồn cười, đặc biệt. đến từ lập trình Java. Và, bạn đã đưa ra một trong những ví dụ điển hình về điều đó.

Và, trong khi các tùy chọn có những lợi ích của chúng, chúng cũng khiến tôi muốn đập máy tính của mình vào các cạnh trên của một cái thùng rác.

Tuy nhiên, nơi Swift thực sự đá đít là sắp đóng cửa ... oh yeah! Java cũng có chúng, nhưng ...

Và, tất nhiên, thực tế là Swift ít nghiêm ngặt hơn trong việc khai báo các loại và những dấu chấm phẩy buồn tẻ đó ... thật tuyệt vời!

Phản ứng:abcdefg12345

0002378

Cấm
Ngày 28 tháng 5 năm 2017
  • Ngày 24 tháng 10 năm 2017
Chờ đã, bây giờ tôi nhìn lại mã của bạn, tôi thấy rằng giá trị Double (chuỗi) của bạn đánh giá là Double ?, là một giá trị tùy chọn.

Bạn không cần một biến mới. Bạn chỉ cần thêm '!' vào Double (chuỗi) của bạn, và nó sẽ hoạt động.

Tôi đoán tôi đã sai khi Swift ngu ngốc trong trường hợp này. Nhưng, tôi đã gặp nhiều trường hợp phàn nàn về trình biên dịch như vậy (không thể so sánh hai kiểu số khác nhau).

Greene

Ngày 15 tháng 7 năm 2015
Fort Worth
  • Ngày 24 tháng 10 năm 2017
Tôi nghĩ rằng một giải pháp Swifty rõ ràng hơn sẽ là lưu trữ MyValue của bạn dưới dạng double hoặc int (có vẻ là như vậy). Sau đó, bạn có thể sử dụng NumberFormatter để xử lý định dạng.

Hoặc bạn có thể sử dụng ràng buộc tùy chọn để mở giá trị. Tôi sẽ thử một trong những phương pháp này trước khi sử dụng lực mở

gnasher729

Cấm
Ngày 25 tháng 11 năm 2005
  • Ngày 24 tháng 10 năm 2017
maculateConception nói: Tôi nghĩ rằng Swift, với tư cách là một ngôn ngữ, đôi khi khá buồn cười, đặc biệt. đến từ lập trình Java. Và, bạn đã đưa ra một trong những ví dụ điển hình về điều đó.
Điều đó là khá khó hiểu. Vấn đề là OP không biết về một tính năng cơ bản của Swift, đó là các giá trị tùy chọn. Hàm tạo Double (Chuỗi) rõ ràng có thể bị lỗi nếu Chuỗi không chứa một số. Đó là lý do tại sao Double (String) không và không thể tạo ra kết quả kiểu Double, mà là một trong kiểu Double? , đó là một Double tùy chọn. Và một Double tùy chọn không thể được so sánh với Int.

'Giải pháp' của bạn thực sự, thực sự khủng khiếp. Các ! nghĩa là 'Tôi chắc chắn việc chuyển đổi này sẽ thành công. Nếu không, hãy làm hỏng ứng dụng '. let d = Double ('1234x')! sẽ chỉ sụp đổ. Cố ý. Bởi vì bạn đã không kiểm tra nil, và nó là nil.

Cách chính xác là kiểm tra lỗi. Ví dụ

nếu cho d = Double (MyValue), d> 10 {
// MyValue chứa một số và số đó là> 10.
} khác {
// MyValue không chứa số hoặc số<= 10.
}

Nếu bạn nghĩ rằng việc viết mã an toàn và thực sự hoạt động là điều đáng giá, thì Swift là ngôn ngữ phù hợp.
Phản ứng:kinh ngạc và ajthom90

0002378

Cấm
Ngày 28 tháng 5 năm 2017
  • Ngày 24 tháng 10 năm 2017
gnasher729 đã nói: Điều đó khá là vô lý. Vấn đề là OP không biết về một tính năng cơ bản của Swift, đó là các giá trị tùy chọn. Hàm tạo Double (Chuỗi) rõ ràng có thể bị lỗi nếu Chuỗi không chứa một số. Đó là lý do tại sao Double (String) không và không thể tạo ra kết quả kiểu Double, mà là một trong kiểu Double? , đó là một Double tùy chọn. Và một Double tùy chọn không thể được so sánh với Int.

Bạn có bị bắt nạt ở trường không? Bạn dường như có lòng tự trọng khá thấp vì bạn không thể đáp lại nếu không tấn công tôi.

Đây sẽ là thông tin liên lạc đầu tiên và cuối cùng của tôi với bạn. Gợi ý cho bạn - hãy thử giao tiếp một cách văn minh hơn, và cuộc sống sẽ trở nên tuyệt vời. Bảo trọng.

Greene

Ngày 15 tháng 7 năm 2015
Fort Worth
  • Ngày 25 tháng 10 năm 2017
gnasher729 cho biết: Cách chính xác là kiểm tra lỗi. Ví dụ

nếu cho d = Double (MyValue), d> 10 {
// MyValue chứa một số và số đó là> 10.
} khác {
// MyValue không chứa số hoặc số<= 10.
}

Điều này là không rõ ràng - điều gì sẽ xảy ra nếu giá trị là<= 10 should produce different results from the value being nil? To be fair, the OP's post is ambiguous as they were forcing the unwrap, meaning a nil value would crash. However in most business cases, a nil value would be handled differently (safely) from an insufficient value.

Một cách sạch hơn nhiều sẽ là:

Mã: // Handle your unwrapping here, and specify what to do in case of a nil guard let d = Double(MyValue) else { return } // Then implement your if statement if d > 10 { // Do what you want if d > 10 } else { // Do what you want if d <= 10 }
Mặc dù, tôi thực sự nghĩ rằng MyValue nên được lưu trữ dưới dạng Double ngay từ đầu và NumberFormatter được triển khai sau đó để xử lý bất kỳ định dạng nào cần thiết. Điều đó có gánh nặng nhận thức thấp hơn nhiều đối với bất kỳ ai đọc mã.
Phản ứng:kinh ngạc

gnasher729

Cấm
Ngày 25 tháng 11 năm 2005
  • Ngày 26 tháng 10 năm 2017
maculateConception said: Bạn có bị bắt nạt ở trường không? Bạn dường như có lòng tự trọng khá thấp vì bạn không thể đáp lại nếu không tấn công tôi.

Đây sẽ là thông tin liên lạc đầu tiên và cuối cùng của tôi với bạn. Gợi ý cho bạn - hãy thử giao tiếp một cách văn minh hơn, và cuộc sống sẽ trở nên tuyệt vời. Bảo trọng.

Tôi không tấn công bạn. Tôi đã tấn công bài đăng của bạn, điều này chứng tỏ rằng bạn biết rất ít về Swift và bao gồm một khuyến nghị rất nguy hiểm. NS

SAIRUS

đến
Ngày 21 tháng 8 năm 2008
  • Ngày 26 tháng 10 năm 2017
Tôi bảo vệ phần lớn thời gian nhưng nếu mỗi hàm trong một lớp bảo vệ cùng một biến ... thì có thể muốn xem xét lại giao diện ban đầu của bạn.

chèn

14 thg 4, 2018
  • 14 thg 4, 2018
Swift, không chắc chắn giá trị của bạn chính xác là int. Có hai lựa chọn để đảm bảo.
1) '!' bạn có thể chỉ ra rằng giá trị này sẽ là int chính xác bằng cách thêm dấu.
Mã: if (Double(MyValue)! > 10) { // } 2) Bạn có thể chỉ định kiểu khi xác định giá trị.
Mã: let value: Int = Double(MyValue)! if (value > 10) { // } ĐẾN

kinh ngạc

28 tháng 1, 2006
  • 27 thg 4, 2018
ynstek đã nói: Swift, không chắc giá trị của bạn chính xác là int. Có hai lựa chọn để đảm bảo.
1) '!' bạn có thể chỉ ra rằng giá trị này sẽ là int chính xác bằng cách thêm dấu.
Mã: if (Double(MyValue)! > 10) { // } 2) Bạn có thể chỉ định kiểu khi xác định giá trị.
Mã: let value: Int = Double(MyValue)! if (value > 10) { // }

Tôi nghĩ rằng ví dụ số 2 của bạn sẽ không thành công vì bạn đang cố gắng gán một chuỗi được truyền thành một chuỗi kép cho một biến Int. Ngoài ra, bạn đang giả sử MyValue không phải là nil, điều này có thể gây ra lỗi thời gian chạy nếu nó là nil hoặc không phải là số.

Giải thích ví dụ số 1 của bạn cũng không đúng. Dấu chấm than không chuyển đổi giá trị thành Int. Nó mở ra giá trị của một biến tùy chọn. Trong ví dụ của bạn, bạn sẽ kết thúc bằng giá trị Double, không phải Int và chỉ khi MyValue không phải là nil hoặc giá trị không phải số.