首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取文本以显示科普特日历日期SwiftUI

如何获取文本以显示科普特日历日期SwiftUI
EN

Stack Overflow用户
提问于 2021-04-27 02:37:33
回答 2查看 41关注 0票数 0

我正在尝试使用NSCalendar初始化器,但我在理解文档时遇到了问题。到目前为止,我所拥有的是

代码语言:javascript
复制
    struct SwiftUIView: View {
    var body: some View {
        
        
        let Date = NSCalendar.init(calendarIdentifier: .coptic)
        
        Text("\(Date)")
        
        
        
    }
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}

它给我一个错误提示:“'NSCalendar?‘可选类型的值必须被解包为’NSCalendar‘类型的值”

如果有人能帮我解决这个问题,那就太好了。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-27 03:02:23

你想要的Swift界面是日历而不是NSCalendar:

代码语言:javascript
复制
let calendar = Calendar(calendarIdentifier: .coptic)

NSCalendar接口来自ObjC,如果日历的名称未知,该接口将返回nil (您可以在ObjC中为此参数传递任意字符串)。

Swift Calendar接口不会失败,因为它不允许您创建未知标识符。

有许多类型以"NS“开头,它们是从Objective-C桥接而来的。对于Swift版本来说,去掉"NS“前缀是很常见的。当您看到这一点时,您通常应该使用Swift版本。它通常会以一种更快的方式运行。

但是,如果您的目标是在科普特日历上显示当前日期,则需要更多内容。日历代表整个日历,而不是特定的日期。您需要一个DateFormatter才能创建本地化字符串。

例如:

代码语言:javascript
复制
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.calendar = Calendar(identifier: .coptic)
dateFormatter.eraSymbols = ["BC", "AM"] // See below
print(dateFormatter.string(from: Date()))

// Baramouda 18, 1737 AM

(我认为日历中有一个错误,科普特日历上有时代符号"ERA0“和"ERA1”。我相信这个日历的正确符号是"BC“和"AM”。您可以通过将它们直接分配给日期格式化程序来强制执行此操作。如果我是正确的,这是一个错误,它会影响你,我建议打开一个Apple Feedback。另请参阅DateFormatter文档,了解如何自定义此字符串。)

根据xTwisteDx的观点,要将此代码放入SwiftUI中,您需要以下内容:

代码语言:javascript
复制
struct ContentView: View {

    let dateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium
        dateFormatter.eraSymbols = ["BC", "AM"] // Workaround for Foundation bug
        dateFormatter.calendar = Calendar(identifier: .coptic)
        return dateFormatter
    }()

    func today() -> String {
        dateFormatter.string(from: Date())
    }

    var body: some View {
        Text(today())
            .padding()
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-04-27 03:02:45

好的,这是一个关于Optional的问题。任何时候你看到?!,你都可以假设它是一个可选的。从本质上讲,它是一个Type?的原因,注意?是因为它可能返回了一个nil值。例如,在Swift中可以使用以下代码片段

代码语言:javascript
复制
let forceUnwrappedString: String!
let optionalString: String?
let safeString: String = "Hello World!"

print(forceUnwrappedString) //This WILL crash, the variable is nil.
print(optionalString) //This MAY crash, if the value is nil.
print(safeString) //This WON'T crash.

处理这些问题的方法是使用if letguard语句进行检查。或者,您也可以在检查nil后强制展开。

如果让

在本例中,如果optionalString为nil,则不会执行打印语句。但是,如果optionalString包含一个值,它将包含一个值。它本质上是一种告诉编译器检查nil值并仅在安全的情况下才运行代码的方法。

代码语言:javascript
复制
if let safeString = optionalString {
    print(safeString)
}

守卫

在本例中,它与If Let的工作方式相同,但显著的不同之处在于,safeString可以在比If Let更大的范围内访问,如果值没有“解包”,它也会返回,因此如果没有安全地解包,它下面的任何代码都不会被调用。

代码语言:javascript
复制
guard let safeString = optionalString { else return }
print(safeString)

强制展开

强制展开是您应该避免的事情,但是在某些情况下它是可以接受的。这是一个强制展开的示例。注意,我使用的!基本上是“我知道这个值不是空的,使用它。”这是您唯一应该使用它的时候,当您可以保证没有nil值的时候。

代码语言:javascript
复制
let someString: String? 

someString = "Hello World!"

print(someString!)

你的问题

在您的问题的上下文中,NSCalendar.init(calendarIdentifier: .coptic)返回一个可选类型或someType?,这意味着它有可能是nil,解决方案如下。

代码语言:javascript
复制
let Date = NSCalendar.init(calendarIdentifier: .coptic)
        
if let safeDate = Date {
        Text("\(safeDate)")
} else {
    //The date value was nil, do something else
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67272070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档