我正在尝试在F#中实现以下Swift方法:
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
if (flatImages?.count) != nil {
if ((flatImages?.count)! > 0) {
let curr_index = (viewController as! FlatImagesContentViewController).page_index
if (curr_index! < flatImages!.count - 1) {
return viewControlerAtIndex(curr_index! + 1)
}
else {
return nil
}
}
return nil
}
return nil
}
这个想法是这个方法在所有情况下都返回null,除了它返回一个可以转换为FlatImagesContentViewController
的{{1}}的方法。
为此,我实施了以下UIViewController
代码:
F#
问题是override x.GetNextViewController(pageViewController : UIPageViewController, contentController : UIViewController) =
let mutable returnController : UIViewController = null
if flatImages.Length > 0 then
let curr_index = (contentController :?> FlatImagesContentViewController).GetPageIndex
if curr_index < flatImages.Length - 1 then
returnController <- viewControllerAtIndex(curr_index + 1)
returnController
中的每个块都需要有一个返回值,因此我无法直接从if块返回,因为这将被视为if块的返回值,而不是整体功能。为了解决这个问题,我创建了初始化为null的F#
变量,然后在函数结束时返回此变量。这是在F#中处理这种用例的正确方法吗?
答案 0 :(得分:2)
拥有一个可变的返回变量在这里没有帮助。在F#中,内置类型不可为空,但.NET / C#类是string
。可以在不同的分支中返回null或字符串。这编译:
if true then
""
else
null
如果您在F#中定义自己的类型,则无法为其分配null
:
type A = { A : int }
if true then
{ A = 1}
else
null // Error: The type 'A' does not have 'null' as a proper value
要解决此问题,您需要将值包装在Option
:
if true then
Some { A = 1}
else
None
现在返回的类型是Option<A>
。必须明确解包Option
值,以便处理None
案例:
let x = Some { A = 1 }
match x with
| Some a -> a.A
| None -> 0