新的SwiftUI教程有以下代码:

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

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

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

关键字有的作用是什么?


当前回答

'some'表示不透明类型。在SwiftUI中,View被声明为一个协议

@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public protocol View {

    /// The type of view representing the body of this view.
    ///
    /// When you create a custom view, Swift infers this type from your
    /// implementation of the required `body` property.
    associatedtype Body : View

    /// Declares the content and behavior of this view.
    var body: Self.Body { get }
}

当你将视图创建为Struct时,你要遵守视图协议,并告诉var主体将返回一些将确认视图协议的内容。它就像一个通用的协议抽象,你不必定义具体的类型。

其他回答

对于那些被这个主题弄晕的人,这里有一篇非常解密和一步步的文章,感谢Vadim Bulavin。

https://www.vadimbulavin.com/opaque-return-types-and-the-some-keyword-in-swift/

在我的理解中(可能是错误的)

这是我拥有的

Protocol View{}

 class Button: View { // subclass of View } 

 //this class not a subclass of View
 class ButtonBuilder<T> where T:View { //using T as View here   } 

Then

var body: View = Button() // ok
var body: View = ButtonBilder() //not ok
var body: some View = ButtonBilder() //ok

So

一些协议

使用该协议的泛型类是否可以在自己的代码中作为协议的子类处理

你可以假设swift是通用的。

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 {
    ...
}

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