Như đã lưu ý bởi @Kirsteins, Swift bây giờ phát hiện các biểu tượng xung đột giữa Swift và Obj-C, và các ký hiệu nhanh chóng có thể gây ra nỗi đau Obj-C. Ngoài các câu trả lời được đưa ra, bạn có thể tránh điều này nói chung bằng cách xác định một nhãn cần thiết cho việc loại bổ sung, thay thế chữ ký cuộc gọi:
import Foundation
extension NSObject {
func foo(d:Double, i:Int) { println("\(d), \(i)") }
func foo(withInt d:Int, i:Int) { println("\(d), \(i)") }
}
let no = NSObject()
no.foo(withInt:1, i: 2)
Ngoài ra mặc dù, và để trả lời câu hỏi trước mắt của bạn, bạn đang cố gắng để áp dụng thành ngữ Obj-C cho Swift. Những gì bạn thực sự muốn, là một trong hai thực hiện didSet
(rất có thể), hoặc có thể set
:
class WhatIDidLastSummer {
var vacation:Bool = false {
didSet {
// do something
}
}
var staycation:Bool {
get { return true }
set {
// do something
}
}
}
Nguồn
2015-02-20 00:13:28
Điều này xuất hiện để ngụ ý rằng quá tải phương thức là không thể trong các lớp như UIViewControllers hoặc thực sự bất kỳ lớp nào phân lớp bất kỳ lớp khách quan-c nào. Đúng không? –
Dường như cách giải quyết khác là khai báo riêng tư. Bằng cách đó trình biên dịch sẽ không cố gắng chuyển đổi chúng sang ObjC để không có xung đột. – kwerle
@kwerle Giải pháp tuyệt vời. Đã không nghĩ về điều này trước đây. – Kirsteins