2015-12-07 27 views
7

Tôi đang sử dụng Generics để thêm các loại khác nhau như Int, Double, Float, v.v. Tôi đã sử dụng mã bên dưới nhưng tôi gặp lỗi "Nhà điều hành nhị phân" + 'không thể áp dụng cho hai toán hạng' T ''.Toán tử nhị phân '+' không thể áp dụng cho hai toán hạng 'T'

func add<T>(num1: T,num2: T) -> T { 
    return num1 + num2 
} 
+4

Và câu hỏi là ...? –

+0

Nếu loại không phải là số? Điều gì hoang dã xảy ra? – zaph

+0

So sánh http://stackoverflow.com/questions/25575513/what-protocol-should-be-adopted-by-a-type-for-a-generic-function-to-take-any-num –

Trả lời

16

Swift không biết rằng loại chung T có toán tử '+'. Bạn không thể sử dụng + trên bất kỳ loại nào: ví dụ: trên hai bộ điều khiển chế độ xem + không có ý nghĩa quá nhiều

Bạn có thể sử dụng sự phù hợp của giao thức để cho phép nhanh chóng biết một số điều về loại của bạn!

Tôi đã có một đi trong một sân chơi và điều này có lẽ là những gì bạn đang tìm kiếm :)

protocol Addable { 
    func +(lhs: Self, rhs: Self) -> Self 
} 

func add<T: Addable>(num1: T, _ num2: T) -> T { 
    return num1 + num2 
} 

extension Int: Addable {} 
extension Double: Addable {} 
extension Float: Addable {} 

add(3, 0.2) 

Hãy cho tôi biết nếu bạn cần bất kỳ của các khái niệm chứng minh ở đây giải thích

+1

thử thêm (CGFloat (2.5), Float (2.0)) –

+0

@LeoDabus Swift không có định nghĩa + cho CGFloat và Float. Để giải quyết điều này, bạn có thể định nghĩa + cho CGFloat và Float. Ngoài ra, bạn có thể thay đổi giải pháp một chút để truyền, loại đầu tiên. –

+0

tnx Adam Campbell vì lời giải thích rất rõ ràng. – user2749248

6

Trong Swift 4/Xcode 9+ bạn có thể tận dụng lợi thế của Numeric protocol.

func add<T: Numeric>(num1: T, num2: T) -> T { 
    return num1 + num2 
} 

print(add(num1: 3.7, num2: 44.9)) // 48.6 
print(add(num1: 27, num2: 100)) // 127 

Sử dụng điều này có nghĩa là bạn sẽ không phải tự tạo giao thức đặc biệt.

Điều này sẽ chỉ hoạt động trong trường hợp bạn cần chức năng được cung cấp bởi giao thức Số. Bạn có thể cần phải làm điều gì đó tương tự như câu trả lời của @ adam cho% và các nhà khai thác khác hoặc bạn có thể tận dụng các giao thức khác do Apple cung cấp trong Xcode 9 SDK.

+1

Nhưng với giải pháp này tất cả các loại phải giống nhau ... các loại phải có khả năng khác nhau tức là Int + Float – StackUnderflow

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