新的SwiftUI教程有以下代码:

struct ContentView: View {
    var body: some View {
        Text("Hello World")
    }
}

第二行是单词some,在他们的网站上突出显示,就好像它是一个关键字一样。

Swift 5.1似乎没有把some作为关键字,而且我不知道some这个词还能在那里做什么,因为它在类型通常的位置。有没有一个新的、未公布的Swift版本?它是一个我不知道的被用在类型上的函数吗?

关键字有的作用是什么?


当前回答

不透明的返回类型

如果你看一下我的例子,你会发现一些手势意味着myGesture属性将始终实现手势协议,然而,具体的实现类型不需要被调用者知道(它是隐藏的)。body属性也是如此——不是提供具体的类型,而是根据它支持的协议(即View)来描述返回值。

代码如下:

import SwiftUI

struct ContentView: View {
    
    @State private var rotate: Angle = .zero
    
    var myGesture: some Gesture {
        RotationGesture()
            .onChanged { rotate = $0 }
            .onEnded { angle in rotate = angle }
    }
    
    var body: some View {
        Rectangle()
            .frame(width: 200, height: 200)
            .foregroundColor(.blue)
            .rotationEffect(rotate)
            .gesture(myGesture)
    }
}

除此之外,所有应用于矩形的SwiftUI修饰符在返回值时也使用some关键字。例如:

func foregroundColor(_ color: Color?) -> some View

其他回答

为了简化,如果你知道两者的区别

var x = 5

vs

int x =5

然后你就会知道一些。 编译器知道它,您也知道它。在不指定具体细节(它使用的泛型类型)的情况下,尽可能地说明您遵守了某些内容

Swift 5.1 (Swift -evolution提议)中的some关键字与协议一起作为返回类型使用。

Xcode 11发布说明是这样的:

函数现在可以通过声明它遵循什么协议来隐藏具体的返回类型,而不是指定确切的返回类型: func makeecollection () -> some Collection { 返回[1,2,3] } 调用该函数的代码可以使用协议的接口,但不能看到底层类型。(se - 0244, 40538331)

在上面的例子中,你不需要告诉你将返回一个Array。这甚至允许您返回一个只符合Collection的泛型类型。


还要注意你可能会遇到的这个错误:

'some'返回类型仅在iOS 13.0.0或更新版本中可用

这意味着你应该使用可用性来避免一些在iOS 12和之前的版本:

@available(iOS 13.0, *)
func makeACollection() -> some Collection {
    ...
}

上面Mischa的帖子(抱歉,我还不能直接添加评论)指出,有些是可选的,除非你使用泛型类型,如VStack等。这是因为some是所有视图都能满足的最一般的不透明类型。因此在这里使用它有助于解决编译错误。

它看起来非常接近于Combine的eraseToAnyPublisher()方法。

你可以假设swift是通用的。

简单的理解方法,比如Objc中的kindOf