检查Swift数组元素是否存在多个条件

时间:2020-04-15 14:54:47

标签: swift

我有对象数组,其中包含带有字符串值的属性。我想要的是,要返回一个指示的Bool值,该数组包含不少于2个对象: -一个对象具有字符串属性,该属性的值等于“ foo” -一个对象具有字符串属性,该属性的值等于“ bar”

到目前为止,我只能通过“丑陋”的方法解决此问题:

!myArr.filter{ $0.property  == "foo"}.isEmpty &&
          !myArr.filter{ $0.property  == "bar"}.isEmpty

有更好的方法吗?

以下是Playground中使用该方法的简单代码:

struct Obj {
  var foo: String
}

let arr = [Obj(foo: "foo"), Obj(foo: "bar"), Obj(foo: "zoo")]

let result = !arr.filter{ $0.foo  == "foo"}.isEmpty && !arr.filter{ $0.foo  == "bar"}.isEmpty
print(result)

2 个答案:

答案 0 :(得分:1)

const DragBox = styled.div(({ isVisible }: { isVisible }) =>
    isVisible
        ? `
        position: fixed;
        display: flex;
        border: 15px dashed white;
        width: 100%;
        height: 100%;
        z-index: 2000;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        flex: 1;
        justify-content: center;
        align-items: center;
        text-align: center;
        font-size: 30px;
        font-weight: 600;
        color: white;
        letter-spacing: 1px;
        margin: auto;
`
        : 'display: none;'
);

const DropZone = ({ children }) => {
    const [isVisible, setIsVisible] = useState(false);

    const onDragEnter = useCallback((e) => {
        setIsVisible(true);
        e.stopPropagation();
        e.preventDefault();
        return false;
    }, []);
    const onDragOver = useCallback((e) => {
        e.preventDefault();
        e.stopPropagation();
        return false;
    }, []);
    const onDragLeave = useCallback((e) => {
        setIsVisible(false);
        e.stopPropagation();
        e.preventDefault();
        return false;
    }, []);
    const onDrop = useCallback((e) => {
        e.preventDefault();
        const files = e.dataTransfer.files;
        console.log('Files dropped: ', files);
        // Upload files
        setIsVisible(false);
        return false;
    }, []);

    useEffect(() => {
        window.addEventListener('mouseup', onDragLeave);
        window.addEventListener('dragenter', onDragEnter);
        window.addEventListener('dragover', onDragOver);
        window.addEventListener('drop', onDrop);
        return () => {
            window.removeEventListener('mouseup', onDragLeave);
            window.removeEventListener('dragenter', onDragEnter);
            window.removeEventListener('dragover', onDragOver);
            window.removeEventListener('drop', onDrop);
        };
    }, [onDragEnter, onDragLeave, onDragOver, onDrop]);

    return (
        <div>
            {children}
            <DragBox
                className="bg-secondary"
                isVisible={isVisible}
                onDragLeave={onDragLeave}
            >
                Drop files to Upload
            </DragBox>
        </div>
    );
};

答案 1 :(得分:-1)

@Larme是正确的,如果您考虑时间复杂度,则在使用filtercontains时,first的最坏情况/最佳情况是 O(n)可以小于 O(n)或什至 O(1)

因此,这种情况的最佳选择是:

myArr.contains(where: {$0.propery == "foo"}) && myArr.contains(where: {$0.propery == "bar"})

((myArr.first(where: {$0.propery == "foo"}) != nil) && (myArr.first(where: {$0.propery == "bar"}) != nil)
相关问题