相关疑难解决方法(0)

在Swift中使用类型名称的通用函数

在C#中,可以通过指定类型来调用泛型方法:

public T f<T>()
{
   return something as T
}

var x = f<string>()
Run Code Online (Sandbox Code Playgroud)

Swift不允许您在调用它时专门化泛型方法.编译器希望依赖类型推断,因此这是不可能的:

func f<T>() -> T? {
    return something as T?
}

let x = f<String>() // not allowed in Swift
Run Code Online (Sandbox Code Playgroud)

我需要的是一种将类型传递给函数的方法,以及使用泛型返回该类型的对象的函数

这有效,但它不适合我想做的事情:

let x = f() as String?
Run Code Online (Sandbox Code Playgroud)

编辑(澄清)

我可能不太清楚这个问题实际上是什么,它是关于调用返回给定类型(任何类型)的函数的更简单的语法.

举个简单的例子,假设您有一个Any数组,并创建一个返回给定类型的第一个元素的函数:

// returns the first element in the array of that type
func findFirst<T>(array: [Any]) -> T? {
    return array.filter() { $0 is T }.first as? T
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样调用此函数:

let array = [something,something,something,...]

let x = …
Run Code Online (Sandbox Code Playgroud)

generics swift swift2

20
推荐指数
1
解决办法
8859
查看次数

将类型传递给通用Swift扩展,或者理想地推断它

说你有

 class Fancy:UIView
Run Code Online (Sandbox Code Playgroud)

你想找到所有兄弟姐妹的Fancy意见. 没问题 ......

    for v:UIView in superview!.subviews
        {
        if let f = v as? Fancy
            { f.hungry = false }
        }
Run Code Online (Sandbox Code Playgroud)

所以,尝试扩展,

public extension UIView
    {
    internal func fancySiblings()->([Fancy])
        {
            return (self.superview!
                .subviews
                .filter { $0 != self }
                .flatMap { $0 as? Fancy }
                )
        }
    }
Run Code Online (Sandbox Code Playgroud)

太棒了,你现在可以

    for f:Fancy in self.fancySiblings()
        { f.hungry = false }
Run Code Online (Sandbox Code Playgroud)

太棒了.

但,

如何推广该扩展以使用任何UIView子类型?

理想情况下,扩展可以推断出类型吗?还有一个类型?

所以,像......

public extension UIView
    {
    internal func siblings<T>( something T )->([T]) …
Run Code Online (Sandbox Code Playgroud)

generics functional-programming ios swift swift-extensions

20
推荐指数
1
解决办法
1546
查看次数

通用核心数据获取请求

我正在尝试为简单的核心数据获取创建一种通用包装器。

我想要实现的是,而不是编写如下所示的多个冗余方法:

func loadNSMOSubclass() -> [NSMOSubclass] {
    let fetchRequest: NSFetchRequest<NSMOSubclass> = NSMOSubclass.fetchRequest()
    do {
        let result = try mainContext.fetch(fetchRequest)
        return result
    }
    catch {
        return []
    }
}
Run Code Online (Sandbox Code Playgroud)

我想我可以为此创建一个通用助手:

struct EntityLoader<T> where T: NSManagedObject {

   func loadEntity() -> [T] {
       let fetchRequest: NSFetchRequest<T> = T.fetchRequest()
       do {
           let mainContext = CoreDataState().mainContext
           let result = try mainContext.fetch(fetchRequest)
           return result
       }
       catch {
           return []
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,此时编译器出现了一个奇怪的错误:

无法将类型的值转换NSFetchRequest<NSFetchRequestResult>为指定类型NSFetchRequest<T>

建议的解决方案更奇怪,因为当我进行转换时,所有内容都会编译:

let fetchRequest: NSFetchRequest<T> = T.fetchRequest() as! NSFetchRequest<T>
Run Code Online (Sandbox Code Playgroud)

这可能很丑陋,但我可以忍受。但是,当我运行此代码时,我收到一个致命错误: …

generics core-data swift

4
推荐指数
1
解决办法
1199
查看次数