2014-11-27 18 views
7

Làm cách nào để tạo bí danh cho hàm nhanh?Bí danh chức năng Swift

Ví dụ

Tôi muốn gọi

LocalizedString("key") 

và nó nên gọi

NSLocalizedString("key", comment:"") 

tôi thấy typealias lệnh nhưng có vẻ như nó chỉ hoạt động với nhiều loại.

+0

bạn có thể tạo một hàm mới mà sẽ gọi NSLocalizedString? – kap

+0

Hm, tôi đã tự hỏi nếu có một cách khác ... như sử dụng một macro hoặc một cái gì đó – Caipivara

+0

'bình luận' được đặt trong tập tin chuỗi bản địa hóa và rất hữu ích cho người dịch, ngay cả khi nó chỉ dành cho bạn. Nó làm cho nó dễ dàng hơn để nhớ những gì chuỗi đó là dành cho. Không phải là một anwer cho câu hỏi của bạn mặc dù. – zisoft

Trả lời

15

Chức năng được đặt tên đóng cửa, vì vậy bạn chỉ có thể gán một hàm cho một biến:

let LocalizedString = NSLocalizedString 

Bạn có thể tạo giả bí danh cho các phương pháp lớp/struct là tốt. Mỗi phương thức thực sự là một hàm curried tĩnh (lớp), lấy một cá thể lớp làm tham số đầu tiên của nó. Vì vậy, cho một lớp:

class MyClass { 
    var data: Int 

    init(data: Int) { 
     self.data = data 
    } 

    func test() { 
     println("\(data)") 
    } 
} 

bạn có thể gán các phương pháp test cho một biến:

let test = MyClass.test 

và sau đó gọi nó như:

var instance = MyClass(data: 10) 
test(instance)() 

CẬP NHẬT

Tôi vừa mới nhận ra rằng tôi đã bỏ lỡ một chi tiết quan trọng trong câu hỏi của bạn: bạn muốn ẩn tham số comment. Và giải pháp được đề xuất của tôi không cho phép điều đó, trong khi giải pháp của @ rintaro thực hiện.

Tuy nhiên tôi sử dụng một cách tiếp cận khác nhau cho rằng: Tôi tạo tiện ích String thực hiện một tài sản tính:

extension String { 
    var localized: String { 
     return NSLocalizedString(self, comment: "") 
    } 
} 

và sau đó tôi chỉ có thể gọi nó trên bất kỳ chuỗi biến hoặc đen:

var string = "test_resource" 
string.localized 

"another_resource".localized 
+0

cảm ơn! Tôi thích ý tưởng mở rộng nhưng có lẽ đó là một chút buộc gói cho chức năng, bạn nghĩ gì? – Caipivara

+0

@danielgomezrico No. Không sao đâu. Chỉ cần đảm bảo kết hợp các hàm này trong một tệp nơi bạn giữ một số phương thức String cùng nhau, ví dụ, 'String + Util.swift' –

+0

Mặt khác, vì' NSLocalized' là một phương thức toàn cục (chủ yếu), bạn có thể muốn đi theo cách đó. –

6

Ngắn nhất là:

let LocalizedString = { NSLocalizedString($0, comment:"") } 

Nhưng, nó thực sự là một func mới sự. Chỉ cần gói NSLocalizedString.


lẽ bạn có thể sử dụng không có giấy tờ @transparent thuộc tính. Nó inline gọi hàm. xem this topic on Developer Forum.

@transparent LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 

Nhưng không khuyến khích. Hơn nữa, miễn là các thử nghiệm của tôi, tất cả các mã sau đây cuối cùng phát ra chính xác cùng một mã IRV LLVM với tối ưu hóa -O.

script1: với @transparent

import Foundation 
@transparent func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
println(LocalizedString("key")) 

script2: không @transparent

import Foundation 
func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
println(LocalizedString("key")) 

script3: Direct NSLocalizedString gọi

import Foundation 
func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
println(NSLocalizedString("key", comment:"")) 

Tất cả những điều trên được gạch chân để thực hiện cuộc gọi trực tiếp NSLocalizedString.

Nhưng, đoạn code sau phát ra khác nhau:

script4: Đóng gói

import Foundation 
let LocalizedString = { NSLocalizedString($0, comment:"") } 
println(NSLocalizedString("key", comment:"")) 

Nó cũng inlined, nhưng thêm refcount hướng dẫn để LocalizedString được chèn vào.

Vì vậy, như một kết luận, bạn nên chỉ cần sử dụng này:

func LocalizedString(key:String) -> String { 
    return LocalizedString(key, comment:"") 
} 
+0

Những người đàn ông của bạn với nội tuyến và được chèn vào? – Caipivara