我正在尝试编写一个Array的扩展,它允许将一个可选的T数组转换成一个非可选的T数组.
例如,这可以写成这样的自由函数:
func removeAllNils(array: [T?]) -> [T] {
return array
.filter({ $0 != nil }) // remove nils, still a [T?]
.map({ $0! }) // convert each element from a T? to a T
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法将其作为扩展工作.我试图告诉编译器扩展只适用于可选值的数组.这是我到目前为止:
extension Array {
func filterNils<U, T: Optional<U>>() -> [U] {
return filter({ $0 != nil }).map({ $0! })
}
}
Run Code Online (Sandbox Code Playgroud)
(它不编译!)
假设我们定义了一组选项:
var arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
Run Code Online (Sandbox Code Playgroud)
我可以用一小段时间强行打开它: var arrayForCrash = arrayOfOptionals.map { $0! }
但这会让应用程序崩溃,还有其他任何简短的方法(没有明确展开)我如何解开一个可选数组?
你认为这很容易.使用此代码,我可以检查表中的多行,但我想要的是一次只检查一行.如果用户选择不同的行,那么我希望旧行只是自动取消选中.不知道该怎么做.这是我的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
UITableViewCell *theCell = [tableView cellForRowAtIndexPath:indexPath];
if (theCell.accessoryType == UITableViewCellAccessoryNone) {
theCell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else if (theCell.accessoryType == UITableViewCellAccessoryCheckmark) {
theCell.accessoryType = UITableViewCellAccessoryNone;
}
}
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何帮助!
假设我有一个名为的Swift对象Animal。我有一系列Animal对象,其中一些可能是nil。
目前,我正在这样做:
arrayOfAnimal.filter({$0 != nil}) as! [Animal]
由于力量解开,这感觉很hacky。想知道是否有更好的方法可以滤除nil。