微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 SwiftUI 中使用本地化字符串对数组进行排序

如何解决如何在 SwiftUI 中使用本地化字符串对数组进行排序

嗨,我的问题是我想按对象的标题属性对对象数组进行排序。当我将标题的类型从 String 更改为 LocalizedStringKey 时,出现错误。有没有办法在 localizedStringKey 后面对正确的翻译字符串进行排序。

struct Item: Codable,Comparable,Hashable,Identifiable {
    static func < (lhs: Item,rhs: Item) -> Bool {
        return lhs.title < rhs.title
    }
    
    var id: Int
    
    let image: String
    let color: String
    
//    title should be LocalizedStringKey
    let title: String

    }
......

    @State private var sortedDown = false
    var filteredItems: [Item] {
        var sortedItems: [Item]
        let filteredItems = modelData.items.filter { item in
            (!showFavoritesOnly || item.isFavorite)
        }
        if sortedDown {
            sortedItems = filteredItems.sorted(by: { (item1,item2) -> Bool in
                return item1.title > item2.title
            })
        } else {
            sortedItems = filteredItems.sorted(by: { (item1,item2) -> Bool in
                return item1.title < item2.title
            })
        }
        return sortedItems
    }
    
    
    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $showFavoritesOnly,label: {
                    Text("showFavorites")
                })
                ForEach(filteredItems) { (item) in
.....

``

解决方法

LocalizedStringKey 不符合 Comparable 协议,因此您不能在其上使用 <> 运算符。

您可以只使用常规的 String,也可以使用自定义比较逻辑。

,

提问时不要忘记提供 minimal reproducible example。你会得到更好、更有针对性的答案。下面是一种方法。

class LocalizeTitleViewModel: ObservableObject {
    @Published var items: [SampleItem] = [SampleItem(title: "orange",isFavorite: true),SampleItem(title: "pink",isFavorite: false),SampleItem(title: "red",isFavorite: true)]
    @Published var sortedDown = false
    @Published var showFavoritesOnly = false
    var filteredItems: [SampleItem] {
        var sortedItems: [SampleItem]
        let filteredItems = items.filter { item in
            (!showFavoritesOnly || item.isFavorite)
        }
        if sortedDown {
            sortedItems = filteredItems.sorted(by: { (item1,item2) -> Bool in
                return item1.localizedTitle > item2.localizedTitle
            })
        } else {
            sortedItems = filteredItems.sorted(by: { (item1,item2) -> Bool in
                return item1.localizedTitle < item2.localizedTitle
            })
        }
        return sortedItems
    }
}
struct LocalizeTitle: View {
    @StateObject var modelData: LocalizeTitleViewModel = LocalizeTitleViewModel()
    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $modelData.showFavoritesOnly,label: {
                    Text("showFavorites")
                })
                ForEach(modelData.filteredItems) { (item) in
                    
                    Text(item.localizedTitle)
                }
            }
        }
    }
}
struct SampleItem: Identifiable {
    
    var id: UUID = UUID()
    let title: String
    var isFavorite: Bool
    
    var localizedTitle: String{
        get{
            //You need a Localizable.strings file in your project that contains all your `title`
            return NSLocalizedString(self.title,comment: "Sample Item title")
        }
    }
}
struct LocalizeTitle_Previews: PreviewProvider {
    static var previews: some View {
        LocalizeTitle()
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。