2015-05-29 28 views
32

Tôi đang cố tạo ứng dụng Swift đơn giản để tính VAT (Thuế giá trị gia tăng = 20%).cho toán hạng loại Int và Double

class ViewController: UIViewController { 

@IBOutlet var resultTextView: UITextView! 
@IBOutlet var inputTextField: UITextField! 
@IBOutlet var calculateVATButton: UIButton! 

override func viewDidLoad() { 


    super.viewDidLoad() 


    func taxesFree(number: Int)-> Double{ 


    var textfield = self.inputTextField.text.toInt()! 
    let VAT = 0.2 
    var result = textfield * VAT 
    return result 

       } 

Đối với một số lý do tôi tiếp tục nhận được

Binary operator * không thể được áp dụng cho toán hạng kiểu Int và Double

trên Line Kết quả

var result = textfield * VAT 

bên trong chức năng.

+0

thể trùng lặp của [không thể được áp dụng cho toán hạng của loại 'UITextField' và 'Int'] (http://stackoverflow.com/questions/29880051/không thể được áp dụng-to-operands-of-type-uitextfield-and-int) – nhgrif

Trả lời

37

Bạn nên chuyển đổi một loại để người kia vì vậy cả hai biến nên các loại tương tự:

var result: Double = Double(textfield) * VAT 
+0

cảm ơn bạn đã giúp tôi không nhận được lỗi thứ hai "không thể gọi kết quả với một danh sách đối số của loại (() - khi tôi Trả lời kết quả –

+0

Xem câu trả lời đã chỉnh sửa – Greg

+5

Cảm ơn Hành vi này hoàn toàn bất tiện, không được thực thi Các nhà sản xuất Swift nên ngừng điều trị cho các nhà phát triển như là tổng số stupids.Bất cứ ai mong đợi 1.5 * 5 = 7.5 và không 7 trừ khi bạn thực hiện một cách rõ ràng cách thức cổ điển để giữ độ chính xác cao nhất o f toán hạng là con đường để đi. Đáng tin cậy và được chứng minh. –

7

Đó là bởi vì bạn đang cố gắng để nhân một Int (textfield) với một đôi (VAT). Bởi vì với một hoạt động như vậy bạn có thể mất đi độ chính xác của Swift đôi không cho phép chuyển đổi cái này sang cái kia, do đó bạn cần phải ngầm đưa cái này vào một cái ...

var result = Double(textfield) * VAT 
3

Trong trường hợp của tôi chỉ cần truyền tới CGFloat:

self.cnsMainFaqsViewHight.constant = CGFloat(self.mainFaqs.count) * 44.0 
1

Vấn đề ở đây là tuyên bố được đưa ra đúng là đúng, vì Swift được nhập mạnh và không ép buộc ngầm. Chỉ cần có một trường hợp tương tự bản thân mình với "toán tử nhị phân" - 'không thể được áp dụng cho các toán hạng kiểu' Ngày 'và' Int '".

Nếu bạn viết:

var result = 10 * 0.2 

... đó là tốt, nhưng nếu bạn viết:

var number = 10 
var result = number * 0.2 

... đó không phải là tốt. Điều này là do các giá trị rõ ràng không được phân loại có một kiểu thích hợp được trình biên dịch chọn, vì vậy trên thực tế dòng đầu tiên được lấy là var result = Double(10) * Double(0.2). Sau khi tất cả, như một con người bạn có thể có nghĩa là 10 được nổi-điểm hoặc một số nguyên - bạn thường sẽ không nói đó và mong đợi rằng để được rõ ràng từ bối cảnh. Nó có thể hơi đau, nhưng ý tưởng về các loại mạnh là sau khi mã được phân tích cú pháp, nó chỉ có thể có một biểu thức biên dịch hợp lệ.

Nói chung, bạn sẽ xây dựng một giá trị mới bằng cách sử dụng hàm tạo, vì vậy, var result = Double(textfield) * VAT trong trường hợp của bạn. Điều này khác với việc đúc (textfield as Double) vì Int không phải là một lớp con của Double; những gì bạn đang làm thay vào đó là yêu cầu một giá trị Double hoàn toàn mới được xây dựng trong thời gian chạy, mất một số độ chính xác nếu giá trị rất cao hoặc thấp. Đây là những ngôn ngữ được đánh máy lỏng lẻo làm ngầm với khá nhiều giá trị ngay lập tức, với chi phí thời gian nhỏ nhưng đáng kể.

Trong trường hợp cụ thể của bạn, nó không có giá trị để có một Int ở nơi đầu tiên (ngay cả khi không có phần nào phần là có thể) vì vậy những gì bạn cần là:

func taxesFree(number: Int) -> Double { 
    var textfield = Double(self.inputTextField.text)! 
    let VAT = 0.2 
    var result = textfield * VAT 
    return result 
} 
0

này đã làm việc cho tôi khi tôi nhận được thông báo lỗi tương tự ở sân chơi:

func getMilk(howManyCartons: Int){ 
    print("Buy \(howManyCartons) cartons of milk") 
    let priceToPay: Float = Float(howManyCartons) * 2.35 
    print("Pay $\(priceToPay)") 
} 
getMilk(howManyCartons: 2) 
0

tôi đã hiểu lầm the Closed Range Operator trong Swift.

Bạn nên không quấn phạm vi trong một mảng: [0...10]

for i in [0...10] { 
    // error: binary operator '+' cannot be applied to operands of type 'CountableClosedRange<Int>' and 'Int' 
    let i = i + 1 
} 

for i in 0...10 { 
    // ok! 
    let i = i + 1 
} 

Phạm vi đó là một bộ sưu tập mà bản thân có thể được lặp. Không cần bọc nó trong một mảng, có lẽ bạn sẽ có trong Objective-C.

Khi bạn nhận ra đối tượng của mình là tập hợp lồng nhau, chứ không phải là một mảng Ints, thật dễ dàng để biết tại sao bạn không thể sử dụng toán tử số trên đối tượng.

0

Bạn có thể chuyển đổi như kết quả var: đúp = đôi (textfield)

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