2014-10-04 20 views
20

Tôi biết câu trả lời này đã được đăng ở một số biểu mẫu khác ở đây, nhưng tôi muốn hiểu thêm về các biến mẫu ghi đè nhanh chóng.Ghi đè nhanh các biến mẫu

Hãy nói rằng tôi có mã này

class BaseView:UIView{ 
let someVariable:Int = 1 
// do some work with someVariable 
} 

class ExtendedView:BaseView{ 
let someVariable:Int = 2 
} 

Ok. Từ những gì tôi đọc, hằng số yêu cầu một tiền tố ghi đè. Câu trả lời khác nói rằng tôi nên tuyên bố setter và getter? Tại sao? Tôi thực sự không quan tâm đến hai người đó. Tôi chỉ cần thay thế giá trị. Tôi thực sự không thể sử dụng ghi đè init vì tôi đang kế thừa từ UIView và điều này có thể khá nguy hiểm (tôi nghĩ).

Bất kỳ đề xuất nào đều được hoan nghênh.

+0

như được viết giống như các biến lớp riêng biệt và không có liên quan, chỉ có cùng tên. –

Trả lời

43

Như bạn nói, bạn không thể đơn giản xác định lại một hằng số trong một phân lớp (nó là một hằng số, sau khi tất cả). Lỗi bạn nhận được là "Không thể ghi đè bằng thuộc tính được lưu trữ". Dường như có thể ghi đè lên số var, tuy nhiên, khi tôi thay đổi let someVariable thành var someVariable Tôi nhận được "sử dụng mơ hồ" someVariable '"khi tôi truy cập nó trong phân lớp (lưu ý - điều tương tự xảy ra cho dù tôi sử dụng override hay không) .

Giải pháp đơn giản nhất là sử dụng trình nâng cấp. Đây thực sự là một chức năng, do đó bạn hạnh phúc có thể ghi đè lên nó, biến sự ủng hộ sẽ được quản lý cho bạn, và nếu bạn không cung cấp một setter ... nó sẽ là không đổi cho mỗi lớp:

class BaseView: UIView { 
    var someVariable: Int { get { return 1 } } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { get { return 2 } } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 

Như commentator @ user3633673 chỉ ra, nếu bạn chỉ có trình khởi động (và không phải là người đặt cược), bạn có thể thả số get, nhưng tôi đã để nguyên tắc đó rõ ràng. Đây là giống nhau mà không có ...

class BaseView: UIView { 
    var someVariable: Int { return 1 } 
    // do some work with someVariable 
} 

class ExtendedView: BaseView { 
    override var someVariable: Int { return 2 } 
} 

let a = BaseView() 
a.someVariable // 1 
let b = ExtendedView() 
b.someVariable // 2 
+8

Đối với một số độc giả, cần lưu ý rằng "lấy" không cần thiết trong các thuộc tính tính toán chỉ đọc đơn giản. 'var someVariable: Int {return 1}' là viết tắt của 'var someVariable: Int {get {return 1}}'. – user3633673

+0

Cảm ơn bạn, đã giải thích rất rõ! –

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