在调用// Twitter中缺少参数#1的参数

时间:2016-04-28 21:35:13

标签: swift twitter parameters ibaction

我正在创建一个每天都会生成不同引用的应用。我想让用户能够与twitter共享给出的报价。我能够通过推文框弹出推特,但报价没有出现。我试图让它发生,现在,我得到一个恒定的错误:

  

调用

中参数#1的参数缺少参数

问题: 我希望能够在用户点击推特按钮后弹出提示时填写推文框

以下是错误enter image description here

的屏幕截图

以下是代码:

@IBAction func shareTweet(sender: AnyObject) {
    if SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter) {
        Share(text:Quote).shareTwitter().characters.count{ sheet in self.presentViewController(sheet, animated: true, completion: nil)};
        let tweetShare:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)

        self.presentViewController(tweetShare, animated: true, completion: nil)

    } else {

        let alert = UIAlertController(title: "Accounts", message: "Please login to a Twitter account to tweet.", preferredStyle: UIAlertControllerStyle.Alert)

        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

        self.presentViewController(alert, animated: true, completion: nil)
    }

}

以下是 share.swift 类:

import Social
struct Share {
let text: String

init(text: String) {
    self.text = text
}

typealias ShareSheet = SLComposeViewController

func shareTwitter(count: Int, action: (ShareSheet -> ()), error: (UIAlertController -> ())) { // Returns either tweetSheet or alert view
    if (count < 140) {
        if (SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter)) {
            // Tweets Quote
            let sheet: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)
            sheet.setInitialText(text)
            action(sheet)
        } else {
            // Not logged into Twitter
            let alert = UIAlertController(title: "Accounts", message: "Please login to a Twitter account to share", preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
            error(alert)
        }
    } else {
        // Character Count is greater then 140
        let alert = UIAlertController(title: "Character Count", message: "Sorry this is too long to tweet", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
        error(alert)
    }
}

非常感谢帮助。先感谢您。 如果您需要更多参考答案,请评论我应该添加到问题中的内容。谢谢。

1 个答案:

答案 0 :(得分:2)

您的shareTwitter(count: action:)函数有两个参数。你没有参数调用它。然后,您尝试在characters.count上调用尾随闭包参数。我假设你的意思是:

Share(text:Quote).shareTwitter(Quote.characters.count) { sheet in self.presentViewController(sheet, animated: true, completion: nil)};

我认为您实际上不需要count功能上的shareTwitter()参数。 Share结构已经存储在属性中的text。为什么不用它?

func shareTwitter(action: (ShareSheet -> ()), error: (UIAlertController -> ())) { // Returns either tweetSheet or alert view
    if (text.characters.count < 140) {
        // Code removed for brevity 

    } else {
        // Code removed for brevity
    }
}

然后你可以像这样调用你的函数:

Share(text:Quote).shareTwitter() { sheet in self.presentViewController(sheet, animated: true, completion: nil)};

此外,您似乎没有在action关闭中返回另一个闭包。我认为你的意思是让你的闭包参数返回Void

另一方面,因为您使用了两个闭包参数,一个用于action,另一个用于error,我认为即使使用该更改,您的代码也不会编译。你需要这样做:

Share(text:Quote).shareTwitter(action: { sheet in 
    self.presentViewController(sheet, animated: true, completion: nil)

}) { error in 

}

使用可能有错误的闭包时,最好的方法是使用Result monad。为自己实现这一点并不困难,但是您可以查看antitypical/Result以获得开箱即用Result monad的库。

通过这两项更改,您的shareTwitter()功能如下所示:

func shareTwitter(action: (Result<ShareSheet, NSError> -> Void)) { // Returns either tweetSheet or alert view
    if (text.characters.count < 140) {
        // Code removed for brevity 

    } else {
        // Code removed for brevity
    }
}

它被称为:

Share(text:Quote).shareTwitter() { result in 
    switch result {
    case .Success(let sheet): 
        self.presentViewController(sheet, animated: true, completion: nil)};

    case .Failure(let error):
        // Do something with your error
    }
}