从函数F#返回null

时间:2018-02-19 13:37:37

标签: .net f# xamarin.ios

我正在尝试在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#中处理这种用例的正确方法吗?

1 个答案:

答案 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