Đối với tôi, tôi sử dụng các phương pháp static
hoặc class
để kiểm soát thuộc tính cấp lớp hoặc nếu tôi phải trả về các phiên bản tùy chỉnh của số class
hoặc sturct
cụ thể đó. Ví dụ, ví dụ như tôi có dưới đây struct
.
struct Person {
let firstName: String
let lastName: String
}
Bây giờ nếu tôi viết một số trường hợp kiểm tra, nơi mà tôi cần dụ Person
's khởi tạo với một tên cụ thể John
trong nhiều lớp học thử nghiệm của tôi, tôi có thể tạo ra một helper static
phương pháp.
extension Person {
static func john() -> Person {
return Person(firstName: "John", lastName: "Appleseed")
}
}
let john = Person.john() // I could also create a static property instead, but its a matter of personal choice and situation.
Trong trường hợp trên, tôi có thể đã thực hiện john
như chức năng toàn cầu cũng nhưng đối với tôi, nó sẽ rất mơ hồ và không thể đọc được.
Một địa điểm khác tôi có thể nghĩ ra nơi tôi thích phương pháp tĩnh đang trả về số lượng trường hợp cho số enum
.
enum Mood {
case happy
case angry
case lazy
case high
static func count() -> Int {
return 4
}
}
Có những nơi, nơi tôi sử dụng các chức năng toàn cầu. Tôi sử dụng chức năng toàn cục để ghi nhật ký.
func log(screenEvent name: String) {
let tracker = GAI.sharedInstance().defaultTracker
tracker.set(kGAIScreenName, value: screenName)
let builder = GAIDictionaryBuilder.createScreenView()
tracker.send(builder.build() as [NSObject : AnyObject])
}
Bên trong, phương pháp này là sử dụng một sharedInstance
, tạo ra một phương pháp toàn cầu làm cho nó dễ dàng truy cập ở khắp mọi nơi trong các dự án giống như một hàm print
mà các bản ghi đầu ra trong giao diện điều khiển, nhưng điều này là đăng nhập vào một số dịch vụ tùy chỉnh.
Một số chức năng toàn cầu khác mà tôi thường đưa vào dự án của mình là người trợ giúp GCD.
func delay(delay:Double, closure: dispatch_block_t) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
func backgroundTask(closure: dispatch_block_t) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), closure)
}
func mainThreadTask(closure: dispatch_block_t) {
dispatch_async(dispatch_get_main_queue(), closure)
}
Chức năng này không cần bất kỳ thông tin nào về lớp học để làm cho chúng trở nên toàn cầu thay vì gói chúng trong lớp.
Về phương thức instance
, như được trả lời bởi @ Duncan C, chúng được gọi trên các trường hợp, khi bạn muốn duy trì trạng thái. Dưới đây ví dụ cho thấy cách sử dụng của cả hai phương pháp tĩnh và dụ.
enum TapType {
case water
case beer
}
struct Tap {
let tapType: TapType
//static method
static func unlimitedBeer() -> Tap {
let beer = Tap(tapType: .beer)
beer.turnOn(forDuration: Float.greatestFiniteMagnitude)
return beer
}
//instance method: will do operation on a particular instance of `Tap`.
func turnOn(forDuration duration: Float) {
//implementation
}
}
let unlimitedBeer = Tap.unlimitedBeer()
Bạn luôn có thể sử dụng convenience
initiliser để initilise một đối tượng với hành vi tùy chỉnh, nhưng một lần nữa, một vấn đề của sự lựa chọn. Trong ví dụ trên, tôi không thể nghĩ ra bất kỳ convenience
bộ tạo hóa đơn nào cung cấp cho tôi bia không giới hạn.
trừ khi finc ở mvc địa phương, tôi thích các lớp học vì bạn biết họ đến từ đâu. hãy thử gỡ lỗi mã của người khác mà nó là một mashup và bạn không có đầu mối. –