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.
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.
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
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
@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' –
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 đó. –
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:"")
}
Những người đàn ông của bạn với nội tuyến và được chèn vào? – Caipivara
bạn có thể tạo một hàm mới mà sẽ gọi NSLocalizedString? – kap
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
'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