首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从泛型类型迅速过渡到CustomStringConvertible

从泛型类型迅速过渡到CustomStringConvertible
EN

Stack Overflow用户
提问于 2015-10-01 14:27:33
回答 1查看 679关注 0票数 2

我已经整理了下面的类(在Swift variable comparison where type is not known中的其他人的帮助下)。

我试图实现的是将闭包传递给SearchOption,当调用getSelectedItemAsString时,它将运行作为参数传入searchOption的闭包,并返回结果。

但是因为selectedOption是一个通用类型,所以它在getSelectedItemAsString()中抱怨Cannot convert value of type '[T]' to expected argument type '[CustomStringConvertible]'

代码语言:javascript
复制
public func getSelectedItemAsString() -> String {
    if self.searchOptionToString != nil && self.selectedOption != nil {
        return self.searchOptionToString!(selectedOption!)
    }
    return ""
}

我不知道该怎么做。将searchOption转换为字符串的实现对于每个SearchOption都是不同的,这就是我需要闭包的原因。

全类

代码语言:javascript
复制
public typealias searchOptionToCloudSearchQuery = ([CustomStringConvertible]) -> String

public class SearchOption<T: Equatable> {

    private var title: String
    private var allowAny: Bool
    private var allowMultiple: Bool
    private var dependencies: [SearchOption]?

    private var selectedOption: [T]?

    private var searchOptionToString: searchOptionToCloudSearchQuery?

    init(title: String, allowAny: Bool, allowMultiple: Bool, dependencies: [SearchOption]?) {
        self.title = title
        self.allowAny = allowAny
        self.allowMultiple = allowMultiple
        self.dependencies = dependencies
    }

    public func setSelectedItem(selectedOption: T) -> Void {
        if self.selectedOption == nil || !self.allowMultiple{
            self.selectedOption = [T]()
        }
        self.selectedOption?.append(selectedOption)
    }

    public func getSelectedItem() -> [T]? {
        return self.selectedOption
    }

    public func setSearchOptionToCloudSearchQueryClosure(closure: searchOptionToCloudSearchQuery) -> Void {
        self.searchOptionToString = closure
    }

    public func getSelectedItemAsString() -> String {
        if self.searchOptionToString != nil && self.selectedOption != nil {
            return self.searchOptionToString!(selectedOption!)
        }
        return ""
    }

}

实现

代码语言:javascript
复制
var make: SearchOption = SearchOption<String>(title: "Make", allowAny: true, allowMultiple: true, dependencies: nil)

make.setSelectedItem("Vauxhall")

var closure: searchOptionToCloudSearchQuery = {(selectedOptions) in

    var stringBuilder = ""
    for item in selectedOptions {
        if item is String {
            stringBuilder += item as! String
        }
    }
    return stringBuilder

}

make.setSearchOptionToCloudSearchQueryClosure(closure)
make.getSelectedItemAsString()

错误

代码语言:javascript
复制
Playground execution failed: /var/folders/b5/3jvkp2jd5q5fmps2hrw91781cmf7f_/T/./lldb/570/playground442.swift:38:61: error: cannot convert value of type '[T]' to expected argument type '[CustomStringConvertible]'
            return self.searchOptionToString!(selectedOption!)
                                              ~~~~~~~~~~~~~~^
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-01 15:11:52

我已经解决了我的问题。

我不是在实现中使用类型,而是与闭包同时定义类型:

代码语言:javascript
复制
var closure: ([String]) -> String = {(selectedOptions) in

    var stringBuilder = ""
    for item in selectedOptions {
        stringBuilder += item
    }
    return stringBuilder

}

然后,使用参数上的泛型类型将type别名移动到类本身中,这将确保闭包类型和searchOption类型匹配:

代码语言:javascript
复制
public class SearchOption<T: Equatable> {

    public typealias searchOptionToCloudSearchQuery = ([T]) -> String

    /.../

    public func getSelectedItemAsString() -> String {
        if self.searchOptionToString != nil && self.selectedOption != nil {
            return self.searchOptionToString!(selectedOption!)
        }
        return ""
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32890112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档